我在ejb中有这段代码
for (PayrollEntry pe : payroll.getEntries()) {
recalculatePayrollEntry(pe);
}
CalculateTotals(payroll);
调用此异步方法
@Asynchronous
public void recalculatePayrollEntry(PayrollEntry pe) {
// Calculate Payroll Entry;
pe.setEarningsEntries(newEarnings);
}
在调用CalcuateTotals之前等待所有重新计算的最佳方法是什么?
答案 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()
。