Как создать цепочку методов asyn c с Java? - PullRequest
0 голосов
/ 19 июня 2020

У меня есть два сервера 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 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...