W mojej aplikacji muszę przetwarzać wiele zadań asynchronicznie z głównego wątku aplikacji i zbierać wyniki każdego zadania. Mam proste rozwiązanie Java, które wykonuje to za pomocą ExecutorService i ExecutorCompletionService, która zbiera wyniki pracy.Wiosenny odpowiednik usługi CompletionService?
Teraz chciałbym przekonwertować mój kod na rozwiązanie Spring. docs pokazuje mi, jak używać atrybutu ExecutorService i @Async, ale nie jestem pewien, jak i czy mogę zebrać wyniki wielu zadań.
Innymi słowy: Szukam wiosennego odpowiednika usługi CompletionService. Czy jest coś takiego?
Mój bieżący kod:
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));
}
}