Java EJB @Asynchronous循环 - 如何在继续之前知道所有调用何时完成?

时间:2011-09-01 19:04:43

标签: java asynchronous concurrency glassfish ejb

我在ejb中有这段代码

for (PayrollEntry pe : payroll.getEntries()) {
    recalculatePayrollEntry(pe);
}

CalculateTotals(payroll);

调用此异步方法

@Asynchronous
public void recalculatePayrollEntry(PayrollEntry pe) {
    // Calculate Payroll Entry;
    pe.setEarningsEntries(newEarnings);
}

在调用CalcuateTotals之前等待所有重新计算的最佳方法是什么?

2 个答案:

答案 0 :(得分:18)

不是将您的异步方法设为void,而是返回Future(表示异步计算)。启动工作,收集所有期货,然后等待完成:

Future<?> recalculatePayrollEntry(PayrollEntry pe) {
    // Calculate Payroll Entry;
    pe.setEarningsEntries(newEarnings);
    return new AsyncResult<Object>(null); // just something symbolic
}

// Usage:
List<Future<?>> results = new ArrayList<>();
for (PayrollEntry pe : payroll.getEntries()) {
    results.add(recalculatePayrollEntry(pe));
}
for (Future<?> result : results){
    result.get(); // await completion
}

CalculateTotals(payroll);

答案 1 :(得分:2)

我相信你可以让你的方法返回AsyncResult Future。方法的返回类型应为Future

收集列表中的所有未来,然后在每个列表上调用.get()