Сделайте EJB звонок с тайм-аутом - PullRequest
5 голосов
/ 18 января 2012

У меня есть EJB A, который вызывает EJB B. Пользовательский интерфейс не должен ждать ответа более 30 секунд. Если некоторые данные отсутствуют, он должен вернуть частичный ответ.

Как определить время ожидания (ограничение 30 секунд) для EJB B?

Я могу определить EJB B как Asynchronous, который возвращает Future, а затем сделать Future.get(30, TimeUnit.SECONDS). Но лучшее ли это решение?

спасибо

P.S. Я использую Glassfish 3.1

Ответы [ 3 ]

5 голосов
/ 18 января 2012

Я бы предложил использовать для этого тайм-аут транзакции.

Я не думаю, что существует стандартный способ его настройки, поэтому он будет зависеть от сервера приложений. Я предполагаю, что вы хотите установить его специально для класса или метода.

Для WebLogic вы можете указать его в "weblogic-ejb-jar.xml" в "транзакции-дескрипторе" или использовать аннотацию "@TransactionTimeoutSeconds".

http://docs.oracle.com/cd/E12839_01/web.1111/e13719/ejb_jar_ref.htm#i1506703

http://docs.oracle.com/cd/E21764_01/web.1111/e13720/annotations.htm#i1438354

Для JBoss AS вы можете установить время ожидания транзакции, используя аннотацию «@TransactionTimeout» или «jboss.xml».

https://community.jboss.org/wiki/TransactionTimeout

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

2 голосов
/ 18 января 2012

Нет способа прервать целевой EJB.Единственный реальный вариант - для целевого EJB совместно и периодически проверять, не превысило ли оно запланированное время отклика.

Даже если вы используете @Asynchronous и время ожидания Future.get, вы просто разблокируетеклиент от ожидания результата;целевой EJB будет продолжать выполняться и потреблять ресурсы.Однако при использовании асинхронных методов вы получаете преимущество встроенного совместного отмены, используя Future.cancel и SessionContext.wasCancelCalled.

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

Чтобы настроить время ожидания для bean-компонента, который применяется ко всем его методам, вы должны настроить атрибут cmt-timeout-in-seconds в glassfish-ejb-jar.xml.

Это значение времени ожидания используется всеми методамиbean-компонент, который инициирует новую транзакцию, неприменим, когда они присоединяются к другой текущей транзакции.

Также можно сослаться на эту ссылку для получения дополнительной информации о тайм-ауте.

...