Java EJB @ Asynchronous loop - Как узнать, когда все вызовы завершены, прежде чем двигаться дальше? - PullRequest
4 голосов
/ 01 сентября 2011

У меня есть этот код в ejb

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

CalculateTotals(payroll);

, который вызывает этот асинхронный метод

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

Каков наилучший способ дождаться выполнения всех этих перерасчетов перед вызовом CalcuateTotals?

Ответы [ 2 ]

18 голосов
/ 01 сентября 2011

Вместо того, чтобы использовать свой асинхронный метод как 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);
2 голосов
/ 01 сентября 2011

Я полагаю, что ваш метод может вернуть AsyncResult, то есть Future. Тип возвращаемого значения метода должен быть Future

Соберите все фьючерсы в списке и затем вызовите .get() для каждого.

...