EJB 3.1:在无状态bean中启动异步任务

时间:2016-02-17 17:37:53

标签: java multithreading jboss7.x ejb-3.1

我有一个@Stateless bean,其中一个方法需要快速返回状态,但在后台线程中执行长时间运行的任务。我的方法是做以下事情:

创建一个线程池来执行这些任务,并使线程池成为一个成员变量:

final ExecutorService m_threadPool = Executors.newFixedThreadPool(5 /* Get from config*/, new ThreadFactory()
{
    public Thread newThread(final Runnable r) {
        return new Thread(r, "NotificationInputHandler Thread");
    }
});

将我的服务方法拆分为两部分:1)createStatus和2)performBigTask

public Result process(final List<String> input) {
    final Result status = createStatus(input)
    m_threadPool.submit(new Runnable() {
        public void run() {
            performBigTask(input);
        }
    });
    return status;
}

我的问题是: 1.这可以用更好的方式完成吗? 2.我在JBoss 7上运行。是否有一个app-server提供的线程池我可以注入而不是实例化我自己的?

1 个答案:

答案 0 :(得分:2)

你可以使用@Asynchronous,有一个其他的无状态会话B bean来完成你的大任务并用@Asynchronous注释它的方法然后让你原来的会话Bean让它在它返回状态之前调用它一个

<强> B:

@Asynchronous
public Future<SomeResult> performBigTask(List<String> input){
/*run your big task*/
return new Asynchronous<SomeResult>(bigTaskResult);}

@EJB B b;
public Result process(final List<String> input) {
final Result status = createStatus(input)
Future<SomeResult>result= b.performBigTask(input);
//check if every thing went well or what ever logic you have 
return status;
}

如果你想看看如何操纵未来这里是一个链接oracle tutorial