2013-11-22 5 views
1

Я занимаюсь разработкой EJB, который делает 10+ звонков другим компонентам (EJB, веб-сервисам и т. Д.) В рамках своей бизнес-логики. В моем случае производительность представляет собой серьезную проблему. Этот EJB будет обслуживать несколько миллионов запросов в день.Как отключить блокирующий вызов внутри EJB?

Мой вопрос: Для каждого из этих 10+ звонков, как я могу использовать таймаут?

Я не могу ждать больше, чем «n» секунд для любого из вызовов, которые нужно вернуть. Если вызов занимает больше, чем «n» секунд, я буду использовать ответ по умолчанию для обработки.

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

ответ

1

Как я могу использовать тайм-аут?

Спецификация ejb3.1 предоставляет возможность установить тайм-аут, используя @AccessTimeout аннотацию, которая применяется для сериализованных вызовов клиентов, которые должны ждать, когда экземпляр Session Bean занят выполнением предыдущего запроса. Очевидно, что (и объяснение, описанное в спецификации) это относится к сессионному компоненту StateFul и Singleton, хотя оно может быть реализовано для Stateless в случае, если пул бэков исчерпывает доступные экземпляры. Обратите внимание, что после запуска бизнес-метода, вызванного клиентом, этот тайм-аут не применяется.

Другая возможность, которая не является частью спецификации, но поддерживается несколькими серверами (see JBoss example), заключается в определении тайм-аута на стороне удаленного клиента. Если клиентский вызов занимает больше времени, чем установленный тайм-аут, клиент будет проинформирован, однако выполнение сервера не будет прервано, что будет недостаточно.

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

Я обычно использую Исполнитель, чтобы решить эту проблему, но, насколько я понимаю, никто не должен порождать нити из внутри EJB ..

Вместо этого вы могли бы использовать ManagedExecutorService класс, который является Расширение экстерьера, подходящее для использования в контейнере EJB.

Кроме того, чтобы реализовать асинхронный вызов в EJB, обратите внимание на аннотацию @Asynchronous, которая обеспечивает абстракцию высокого уровня для решения проблемы многопоточности, с которой вы сталкиваетесь. Отменить() метод класса Future, позволяет вам прервать выполнение потока, если вы считаете, что процесс занял слишком много времени.

0

, так как вы не обеспечивают много деталей вашей среды:

  • использование боб транзакции, управляемые и установить тайм-аут транзакции
  • EE7: обеспечивает управляемый сервис ИСПОЛНИТЕЛЬ
  • EE6: индивидуальное обслуживание ИСПОЛНИТЕЛЬ как Разъем JCA
Смежные вопросы