Jboss 纯ejb3.0spring';s ThreadPoolTaskExecutor类解决方案

Jboss 纯ejb3.0spring';s ThreadPoolTaskExecutor类解决方案,jboss,ejb-3.0,ejb,parallel-processing,Jboss,Ejb 3.0,Ejb,Parallel Processing,在基于EJB3.0和JBoss5的应用程序中,我需要实现允许同时处理多条指令的功能。例如,有一个有状态的侦听EJB,在接收数据(异步)的情况下,它会触发池中的无状态bean进行计算。在一个SLSB中运行执行不会停止在另一个SLSB中开始执行(如果在第一个SLSB完成其工作之前收到SFSB的请求)。这与Spring ThreadPoolTaskExecutor很相似——任务被传递到队列中,当有线程可以处理它时,它会从队列中获取它(一切都是并行完成的) 不幸的是,我不能使用Spring或其他版本的E

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

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

提前感谢所有提示


Piotr

使用
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 ...
}
@无状态
公共类SomeBean实现SomeBeanLocal{
公共未来getByUserIDAsync(长用户ID){
SomeBeanLocal asyncSomeBean=AsyncUtils.mixinAsync(this);
asyncSomeBean.getByUserID(userID);
return(Future)AsyncUtils.getFutureResult(asyncSomeBean);
}
//普通非异步方法或此处的其他异步方法。。。
}
这将向每个EJB容器拥有的托管线程池发送调用,并立即返回。然后,代码将在后台运行

JMS和消息驱动bean在过去确实被用于此目的,但它不是完成此任务的最佳工具。您会遇到一系列事务性问题,如在事务提交之前无法发送消息等。返回值也比较困难。EJB3定时器也用于此,因为它们也异步执行代码


我知道您提到目前无法切换到另一个EJB版本,但我想说的是,在EJB3.1中,可以使用@Asynchronous注释。这确实是解决这个问题的最好办法。

就是这样!非常感谢你。