纯EJB 3.0 Spring的ThreadPoolTask​​Executor式解决方案

时间:2011-01-22 20:54:59

标签: jboss ejb-3.0 ejb parallel-processing

在我基于EJB3.0和JBoss5的应用程序中,我需要实现允许同时处理多个指令的功能。例如。有一个有状态侦听EJB,在接收数据(异步)的情况下触发池化无状态bean来进行计算。在一个SLSB中运行执行不会停止在另一个SLSB中开始执行(如果在第一个SLSB完成其工作之前SFSB接收到请求)。它类似于Spring ThreadPoolTask​​Executor - 任务被传递到队列中,当有一个可用于处理它的线程时,它从队列中获取它(一切都是并行的)。

不幸的是我不能使用Spring或其他版本的EJB规范(但我可以使用一些JBoss特有的功能)。我怎么能实现这样的事情呢?我想过使用MDB作为任务执行器,但我不确定它是否会同时完成(这是我的第一个问题;))以及它是否是一种正确的使用JMS的方式(严格来说不是“消息传递”)。

提前感谢所有提示。

·彼得

1 个答案:

答案 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注释。这确实是解决这个问题的最好方法。