Будущее <V>и исключение - PullRequest
       50

Будущее <V>и исключение

6 голосов
/ 07 октября 2011

Как обеспечить, чтобы исключение, выбрасываемое методом @Asynchronous из методов EJB 3.1, не было незаметно поглощено Future?
Я знаю, что можно использовать метод Future.get для извлечения исключения, но он будет ждать, пока вычисление не будет выполнено, проблема в том случае, если исключение не возникает, и вам нужно подождать, пока вычисление закончится.

(Обновление)

Сценарий довольно прост.EJB без сохранения состояния предоставляет метод @Asynchronous annotation, в первую очередь предназначенный для @Local.AS - это JBoss.Во время вычислений возможно, что возникает RuntimeException.Клиенты могут или не могут хотеть опросить, если работа завершена, но во всех случаях они должны знать, произошло ли исключение.В качестве обходного пути можно использовать какой-то обратный вызов, но мне интересно, есть ли какое-либо готовое решение.

Ответы [ 3 ]

1 голос
/ 08 октября 2011

Рассматривали ли вы вызов Future # get (timeout, timeUnit) для возврата элемента управления по истечении заданного времени, если результатов нет (вычисление не завершено)? Вы также можете вызвать Future # isDone () до Future # get (), чтобы узнать, завершена ли обработка.

В любом случае вам все равно нужно вызвать Future # get (-), чтобы узнать, что произошло, и быть уверенным, что исключение не проглочено.

НТН.

0 голосов
/ 21 января 2012

Если у вас есть доступ к конфигурации вашего EJB-контейнера и вы можете установить исполнителя, то вы можете Guava ' addCallback . Этот метод требует com.google.common.util.concurrent.ListenableFuture вместо обычного. Такое будущее вы получите, установив для исполнителя вашего экземпляра значение ListeningExecutorService. Guava предоставляет фабричный метод для украшения каждого ExecutorService как ListeningExecutorService, так что вы можете свободно использовать любой ExecutorService, который у вас был заранее.

0 голосов
/ 21 января 2012

Есть решение вашей проблемы. Способ обратного отсчета реализован, чтобы уведомить вызывающий поток, сколько будущих задач выполнено. здесь - пример использования обратного отсчета. Поэтому реализуйте небольшой синхронный класс и добавьте экземпляр ко всем вызываемым объектам при отправке. это должно работать как обратный вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...