Асинхронный вызов длительного процесса по нажатию кнопки в JSF

Я хочу выполнить хранимую процедуру, нажав кнопку, разработанную в JSF и Java. Выполнение процедуры занимает примерно около 30 минут.

Когда пользователь нажимает на эту кнопку, он должен получить сообщение по умолчанию, например:

Данные обрабатываются. Пожалуйста, войдите в систему через 60 минут, чтобы проверить данные.

Теперь, когда мы нажимаем на кнопку, страница пользовательского интерфейса зависает на время выполнения процедуры.

Есть ли обходной путь, чтобы показать это сообщение по умолчанию и запустить процесс в бэкэнде?


person whywake    schedule 07.08.2015    source источник


Ответы (2)


Просто активируйте метод EJB @Asynchronous. Он запустит и забудет отдельный поток, и метод действия bean-компонента немедленно вернется.

@Named
public class Bean {

    @EJB
    private Service service;

    public void submit() {
        service.asyncDoSomething();

        // Add message here.
    }

}
@Stateless
public class Service {

    @Asynchronous
    public void asyncDoSomething() {
        // ...
    }

}

Смотрите также:

person BalusC    schedule 07.08.2015

Вы можете вызвать метод нажатием кнопки, который может использовать Future или FutureTask, доступный в пакете java.util.concurrent. Первый — это интерфейс, второй — реализация интерфейса Future.

Используя "Future" в ваш код, ваша асинхронная задача будет выполнена немедленно с обещанием, что результат будет доступен вызывающему потоку в будущем.

Взгляните на эту ссылку: Безопасно ли запускать новый поток в управляемом компоненте JSF?
Также взгляните на эту ссылку:

person Amit Bhati    schedule 07.08.2015