Пружинная загрузка Asyn c с многопоточностью - PullRequest
1 голос
/ 05 марта 2020

У меня есть микросервис с пружинной загрузкой, где мы вызываем несколько сервисов (скажем, Сервис A и Сервис B). Я пытаюсь вызвать эти две службы асинхронно в нескольких потоках на основе некоторых условий, и после завершения обработки я хотел бы объединить ответ от служб A и ServiceB.

Я знаю, что мы можем использовать @ Asyn c чтобы запустить процесс асинхронно и использовать ExecutorService для запуска нескольких потоков для службы.

Но я не уверен, как сохранить все вместе. Итак, ищите какие-либо предложения здесь?

              @Async
              Service A(thread1,thread2) \
MicroService /                             (Merge from Response of ServiceA and ServiceB)
             \ @Async
              Service B(thread1,thread2) /

Я знаю, что это в основном объясняется теоретически выше, но я попытался проследить / просмотреть несколько веб-сайтов, но большинство статей либо объясняет об Ayn c или многопоточности, но не Убедитесь, как ждать и запустить два процесса в Asyn c в нескольких потоках и продолжить выполнение после завершения этих двух вызовов службы!

Любые предложения или предложения приветствуются! TIA:)

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

Вам нужно использовать класс Spring AsyncResult, чтобы обернуть ваш результат, а затем использовать его метод .completable(), чтобы вернуть CompletableFuture объект.

При объединении будущего объекта используйте CompletableFuture.thenCompose () и CompletableFuture.thenApply () для объединения данных следующим образом:

CompletableFuture<Integer> result = futureData1.thenCompose(fd1Value -> 
                futureData2.thenApply(fd2Value -> 
                        merge(fd1Value, fd2Value)));

Вот базовый c пример:

Annotate Spring основной класс загрузки с @EnableAsync аннотацией

@SpringBootApplication
@EnableAsync
public class StackOverflowApplication {

    public static void main(String[] args) {
        SpringApplication.run(StackOverflowApplication.class, args);
    }

}

Создание примера службы, которая будет возвращать CompletableFuture

Aservice. java

@Service
public class Aservice {

    @Async
    public CompletableFuture<Integer> getData() throws InterruptedException {
        Thread.sleep(1000 * 3); // sleep for 3 sec
        return new AsyncResult<>(2).completable(); // wrap integer 2
    }
}

Bservice. java

@Service
public class Bservice {

    @Async
    public CompletableFuture<Integer> getData() throws InterruptedException {
        Thread.sleep(1000 * 2); // sleep for 2 sec
        return new AsyncResult<>(1).completable(); // wrap integer 1
    }
}

Создать другой сервис который объединит два других служебных данных

ResultService. java

@Service
public class ResultService {

    @Autowired
    private Aservice aservice;
    @Autowired
    private Bservice bservice;

    public CompletableFuture<Integer> mergeResult() throws InterruptedException, ExecutionException {
        CompletableFuture<Integer> futureData1 = aservice.getData();
        CompletableFuture<Integer> futureData2 = bservice.getData();

        CompletableFuture<Integer> result = futureData1.thenCompose(fd1Value -> 
            futureData2.thenApply(fd2Value -> 
                    fd1Value + fd2Value)); // add future integer data

        return result;  

    }
}

Создать образец контроллера для тестирования

ResultController. java

@RestController
public class ResultController {

    @Autowired
    private ResultService resultService;

    @GetMapping("/result")
    CompletableFuture<Integer> getResult() throws InterruptedException, ExecutionException {
        return resultService.mergeResult();
    }

}
0 голосов
/ 05 марта 2020

Вы можете посмотреть на CompletableFuture java. ComplitableFuture позволяет объединить несколько асинхронных c задач (которые также являются CompletableFuture) и ожидает результата всех CompletableFutures. Я не уверен, что он точно подходит для вашего случая, но это может быть полезно. https://www.baeldung.com/java-completablefuture#Multiple

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