У меня есть два сервера Rest, назовите их ServerA и ServerB. У меня есть метод executeOperations на ServerA, и я хочу запустить и связать результаты этих методов.
Проблема в том, что эти операции должны выполняться на ServerB, и эти два сервера имеют асинхронную c связь. Я буду отправлять запросы на ServerB с методами аутентификации и executeOperation, и он будет отправлять ответы с использованием некоторых конечных точек на ServerA, как показано ниже.
Я буду использовать эти случайно сгенерированные UUID для сопоставления запроса и ответов между двумя серверами.
Как я могу создать исполнителя задания для эффективной обработки этой цепочки операций?
public void executeOperations(List<Operation> operationList){
for(Operation operation : operationList){
//Create randomGeneratedIdA and randomGeneratedIdB
RestClient.authenticate(randomGeneratedIdA, operation.getUsername());
RestClient.executeOperation(randomGeneratedIdB, AuthenticationResponse);
}
}
//Rest Server B will call this method
public void insertAuthenticationResponse(randomGeneratedIdA, AuthenticationResponse response){
}
//Rest Server B will call this method
public void insertExecutionResponse(randomGeneratedIdB, ExecutionResponse response){
}
Моя текущая структура: я использую ConcurrentHashMap для обмена данными между разными потоками. Проблема в том, что из-за метода take () ConcurrentHashMap потоки My ExecutorService ожидают, и я не мог отправить запросы аутентификации другой операции на ServerB, ожидая ответов.
public void executeOperations(List<Operation> operationList){
ExecutorService executorService = Executors.newFixedThreadPool(10);
for(Operation operation : operationList){
CompletableFuture<AuthenticationResponse> completableFuture = CompletableFuture.supplyAsync(() -> {
RestClient.authenticate(randomGeneratedIdA, operation.getUsername());
AuthenticationResponse response = ConcurrentHashMap.take(randomGeneratedIdA); //All 10 threads are waiting
return response;
}, executorService);
completableFuture.thenAcceptAsync(authenticationResponse -> {
RestClient.executeOperation(randomGeneratedIdB, authenticationResponse);
ExecutionResponse response = ConcurrentHashMap.take(randomGeneratedIdB);
}, executorService);
}
}
Мои методы отдыха; 1014 *