我有一个@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.是否有一个应用服务器提供了我可以注入而不是实例化自己的线程池的线程池?
最佳答案
您可以使用@Asynchronous,让另一个无状态会话B Bean来完成您的大任务,并使用@Asynchronous注释其方法,然后让您的原始会话Bean在返回状态之前调用它A
B:
@Asynchronous
public Future<SomeResult> performBigTask(List<String> input){
/*run your big task*/
return new Asynchronous<SomeResult>(bigTaskResult);}
A:
@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;
}
如果您想了解如何操作Future,请点击链接oracle tutorial