Как я могу использовать тайм-аут?
Спецификация ejb3.1 предоставляет возможность установить тайм-аут, используя @AccessTimeout аннотацию, которая применяется для сериализованных вызовов клиентов, которые должны ждать, когда экземпляр Session Bean занят выполнением предыдущего запроса. Очевидно, что (и объяснение, описанное в спецификации) это относится к сессионному компоненту StateFul и Singleton, хотя оно может быть реализовано для Stateless в случае, если пул бэков исчерпывает доступные экземпляры. Обратите внимание, что после запуска бизнес-метода, вызванного клиентом, этот тайм-аут не применяется.
Другая возможность, которая не является частью спецификации, но поддерживается несколькими серверами (see JBoss example), заключается в определении тайм-аута на стороне удаленного клиента. Если клиентский вызов занимает больше времени, чем установленный тайм-аут, клиент будет проинформирован, однако выполнение сервера не будет прервано, что будет недостаточно.
Установка таймаута транзакции не является хорошим вариантом, поскольку нет гарантии, что поток, выполняющий бизнес-логику, будет прерван, когда истечет время ожидания транзакции.
Я обычно использую Исполнитель, чтобы решить эту проблему, но, насколько я понимаю, никто не должен порождать нити из внутри EJB ..
Вместо этого вы могли бы использовать ManagedExecutorService класс, который является Расширение экстерьера, подходящее для использования в контейнере EJB.
Кроме того, чтобы реализовать асинхронный вызов в EJB, обратите внимание на аннотацию @Asynchronous, которая обеспечивает абстракцию высокого уровня для решения проблемы многопоточности, с которой вы сталкиваетесь. Отменить() метод класса Future, позволяет вам прервать выполнение потока, если вы считаете, что процесс занял слишком много времени.