我尝试运行一个异步进程。
基于这个例子:http://tomee.apache.org/examples-trunk/async-methods/README.html
但方法addWorkflow(Workflow workflow)
仅当代码在时才会返回run(Workflow workflow)
已完全完成。
然后当它返回时result.get();
被调用我会得到异常:
引起原因:java.lang.IllegalStateException:对象不代表实际的Future
有什么建议吗?我缺少什么?
@Singleton
public class WorkflowProcessor {
@EJB
private WorkflowManager workflowManager;
private final static Logger log = Logger.getLogger(WorkflowProcessor.class.getName());
public void runWorkflows(Collection<Workflow> workflows) throws Exception{
final long start = System.nanoTime();
final long numberOfWorkflows = workflows.size();
Collection<Future<Workflow>> asyncWorkflows = new ArrayList<>();
for(Workflow workflow : workflows){
Future<Workflow> w = addWorkflow(workflow);
asyncWorkflows.add(w);
}
log.log(Level.INFO, "workflow jobs added {0}", new Object[]{numberOfWorkflows});
for(Future<Workflow> result : asyncWorkflows){
result.get();
}
final long total = TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start);
log.log(Level.INFO, "WorkflowProcessor->runWorkflows {0} workflows completed in:{1}", new Object[]{numberOfWorkflows, total});
}
@Asynchronous
@Lock(LockType.READ)
@AccessTimeout(-1)
private Future<Workflow> addWorkflow(Workflow workflow){
run(workflow);
return new AsyncResult<Workflow>(workflow);
}
private void run(Workflow workflow){
this.workflowManager.runWorkflow(workflow);
}
因此,正常的方法是在调用者方法的另一个 bean 中使用 @Asynchronous 方法。
@Stateless
public class ComputationProcessor {
@Asynchronous
public Future<Data> performComputation {
return new AsyncResult<Data>(null);
}
}
@Stateless
public class ComputationService {
@Inject
private ComputationProcessor mProcessor;
public void ...() {
Future<Data> result = mProcessor.performComputation();
...
}
}
正如您所发现的,如果 @Asynchronous 方法与调用者位于同一个 bean 中,它将不起作用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)