首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java @异步方法:不运行异步

java @异步方法:不运行异步
EN

Stack Overflow用户
提问于 2013-02-08 10:38:41
回答 2查看 4.9K关注 0票数 3

我试图让异步进程运行。基于这个例子:http://tomee.apache.org/examples-trunk/async-methods/README.html

但是addWorkflow(Workflow workflow)方法只有在run(Workflow workflow)中的代码完全完成后才会返回。

然后,当它返回并调用result.get();时,我将得到异常:

由: java.lang.IllegalStateException: Object引起的不代表急性未来

有什么建议吗我错过了什么?

代码语言:javascript
复制
@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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-08 19:35:25

问题是Java不能修饰这个隐含的指针。

换句话说,@异步注释将不会被处理,您正在执行一个普通的方法调用。

您可以使用对自身的引用(例如,"self")注入您的so singleton,然后调用self.addWorkflow。

您还可以考虑在无状态bean中运行异步代码。您正在为addWorkflow使用一个读锁,但是runWorkflow仍然有一个写锁。我认为您现在有一个死锁:在工作完成之前,您将持有该锁,但在释放写锁之前,无法完成任何工作。

票数 4
EN

Stack Overflow用户

发布于 2014-01-10 07:52:56

因此,通常的方法是在调用方方法的另一个bean中使用@异步方法。

代码语言:javascript
复制
@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();
   ...
 }
}

正如您所发现的,如果@异步方法在同一个bean中而不是调用方,它就无法工作。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14770672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档