2012-01-18 1 views
5

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

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

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

спасибо

P.S. Я использую стеклянную рыбу 3.1

ответ

0

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

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

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

2

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

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

+0

Я не хочу прерывать EJB. Идея состояла в том, чтобы вернуть ответ (или «ошибку тайм-аута») в пользовательский интерфейс через 30 секунд. – lili

+2

Конечно, но тайм-аут переднего конца без тайм-аута на заднем плане кажется неразумным. В конце концов ваши потоки будут потребляться, и ваши интерфейсные потоки должны будут ждать в любом случае. Учитывая то, что вы сказали, использование '@ Asynchronous', вероятно, лучше всего. –

5

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

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

Для 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

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