Используйте org.jboss.ejb3.common.proxy.plugins.async.AsyncUtils
.Это выполняет код на любой SLSB (или даже на других bean-компонентах, имеющих интерфейс) асинхронно.
Пример:
@Stateless
public class SomeBean implements SomeBeanLocal {
public Future<Order> getByUserIDAsync(Long userID) {
SomeBeanLocal asyncSomeBean = AsyncUtils.mixinAsync(this);
asyncSomeBean.getByUserID(userID);
return (Future<Order>) AsyncUtils.getFutureResult(asyncSomeBean);
}
// normal non-async methods or other async methods here ...
}
Это будет отправлять вызов в пул управляемых потоков, который каждый контейнер EJBимеет и немедленно вернуться.Затем код будет работать в фоновом режиме.
JMS и объекты, управляемые сообщениями, действительно использовались для этого в прошлом, но это не лучший инструмент для JOB.Вы сталкиваетесь с множеством транзакционных проблем, таких как сообщения, которые не отправляются, пока транзакция не будет зафиксирована и т. Д. Также сложнее вернуть значение.Для этого также использовались таймеры EJB3, так как они также выполняют код асинхронно.
Я знаю, что вы упомянули, что вы не можете переключиться на другую версию EJB в данный момент, но я хотел бы отметить, что в EJB 3.1 однаможно использовать аннотацию @Asynchronous.Это действительно лучший способ решения этой проблемы.