我有一个@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提供的线程池我可以注入而不是实例化我自己的?
答案 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