EJB 3.1:在无状态 bean 中启动异步任务
EJB 3.1: Kick off asynchronous task in stateless bean
我有一个 @Stateless
bean,其中一个方法需要快速 return 一个状态,但在后台线程中执行一个很长的 运行 任务。我的方法是执行以下操作:
为执行这些任务创建线程池,并将线程池设为成员变量:
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 call returns状态
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,请点击这里 link oracle tutorial
我有一个 @Stateless
bean,其中一个方法需要快速 return 一个状态,但在后台线程中执行一个很长的 运行 任务。我的方法是执行以下操作:
为执行这些任务创建线程池,并将线程池设为成员变量:
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 call returns状态
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,请点击这里 link oracle tutorial