java @异步方法: not running async

标签 java jakarta-ee

我尝试运行一个异步进程。 基于此示例:http://tomee.apache.org/examples-trunk/async-methods/README.html

但是只有当run(Workflowworkflow)中的代码完全完成时,方法addWorkflow(Workflowworkflow)才会返回。

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

Caused by: java.lang.IllegalStateException: Object does not represent an acutal 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 中,它将不起作用。

关于java @异步方法: not running async,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14770672/

相关文章:

scala - 对于基于 Play 2.0 的 Java 应用程序,我可以使用 groovy 模板而不是 scala 吗?

java - MySQL jdbc驱动和Eclipse问题

java - 使用生成的 keystore 文件的 tomcat https 配置

java - 如何将带有 <String, Integer> 的自定义 header 添加到 Spring Boot HttpHeaders?

java - 具有相同输出的断言失败错误

java - Java中数组的和

java - Mockito 方法为使用的变量抛出空指针异常

java - activemq http 代理

java - 当我使用 ResourceBundle 从属性文件中获取值时,出现异常

java - AlertDialog 再次打开