В моем приложении мне приходится обрабатывать несколько заданий асинхронно из основного потока приложений и собирать результат каждого задания. У меня есть простое Java-решение, которое делает это с помощью ExecutorService и ExecutorCompletionService, который собирает результаты работы.Весенний эквивалент CompletionService?
Теперь я хотел бы преобразовать свой код в решение Spring. docs показать мне, как использовать аннотацию ExecutorService и @Async, но я не уверен, как и могу ли я собирать результаты нескольких заданий.
Другими словами: Я ищу эквивалент Spring для CompletionService. Что-то подобное существует?
Мой текущий код:
class MyService {
private static ExecutorService executorService;
private static CompletionService<String> taskCompletionService;
// static init block
static {
executorService = Executors.newFixedThreadPool(4);
taskCompletionService = new ExecutorCompletionService<String>(executorService);
// Create thread that keeps looking for results
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Future<String> future = taskCompletionService.take();
String s = future.get();
LOG.debug(s);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
}).start();
}
// This method can and will be called multiple times,
// so multiple jobs are submitted to the completion service
public void solve(List<Long> ids) throws IOException, SolverException {
String data = createSolverData(ids);
taskCompletionService.submit(new SolverRunner(data, properties));
}
}