在我基于EJB3.0和JBoss5的应用程序中,我需要实现允许同时处理多个指令的功能。例如。有一个有状态侦听EJB,在接收数据(异步)的情况下触发池化无状态bean来进行计算。在一个SLSB中运行执行不会停止在另一个SLSB中开始执行(如果在第一个SLSB完成其工作之前SFSB接收到请求)。它类似于Spring ThreadPoolTaskExecutor - 任务被传递到队列中,当有一个可用于处理它的线程时,它从队列中获取它(一切都是并行的)。
不幸的是我不能使用Spring或其他版本的EJB规范(但我可以使用一些JBoss特有的功能)。我怎么能实现这样的事情呢?我想过使用MDB作为任务执行器,但我不确定它是否会同时完成(这是我的第一个问题;))以及它是否是一种正确的使用JMS的方式(严格来说不是“消息传递”)。
提前感谢所有提示。
·彼得
答案 0 :(得分:2)
使用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和Message驱动的bean过去确实已经用于此,但它不是JOB的最佳工具。您遇到了一堆事务性问题,例如在事务提交之前不发送消息等。返回值也更难。 EJB3计时器也用于此,因为它们也异步执行代码。
我知道你提到过你现在无法切换到另一个EJB版本,但我想提一下,在EJB 3.1中可以使用@Asynchronous注释。这确实是解决这个问题的最好方法。