Я пытаюсь выполнять асинхронные вызовы из веб-службы Spring Boot в другой веб-сервис. Я вижу , как можно использовать аннотацию Spring @Async
, но мне не нравится, как она требует написания кода.
Вот пример, показывающий, как я думаю, что кодбудет выглядеть с использованием @Async
:
@Configuration
@EnableAsync
public class SpringAsyncConfig
{
@Bean(name = "fruitTaskExecutor")
public Executor fruitTaskExecutor()
{
return new ThreadPoolTaskExecutor();
}
}
@Component
public class FruitClient
{
@Async("fruitTaskExecutor")
public CompletableFuture<List<Fruit>> getFruits(String type)
{
CompletableFuture<List<Fruit>> fruitList = [get fruits from another web service];
return CompletableFuture.supplyAsync(() -> {
return [get fruits from another web service];
});
}
}
@Service
pubilc class FruitComparisonService
{
@Autowired
private FruitClient fruitClient;
public FruitComparison compareApplesAndOranges()
{
CompletableFuture<List<Fruit>> appleFuture = fruitClient.getFruits("APPLES");
CompletableFuture<List<Fruit>> orangeFuture = fruitClient.getFruits("ORANGES");
List<Fruit> apples = appleFuture.get();
List<Fruit> oranges = orangeFuture.get();
return [compare apples and oranges];
}
}
И здесь без использования @Async
:
@Configuration
public class SpringAsyncConfig
{
@Bean(name = "fruitTaskExecutor")
public Executor fruitTaskExecutor()
{
return new ThreadPoolTaskExecutor();
}
}
@Component
public class FruitClient
{
public List<Fruit> getFruits(String type)
{
return [get fruits from another web service];
}
}
@Service
pubilc class FruitComparisonService
{
@Autowired
@Qualifier("fruitTaskExecutor")
private Executor executor;
@Autowired
private FruitClient fruitClient;
public FruitComparison compareApplesAndOranges()
{
CompletableFuture<List<Fruit>> appleFuture =
CompletableFuture.supplyAsync(() -> fruitClient.getFruits("APPLES"), executor);
CompletableFuture<List<Fruit>> orangeFuture =
CompletableFuture.supplyAsync(() -> fruitClient.getFruits("ORANGES"), executor);
List<Fruit> apples = appleFuture.get();
List<Fruit> oranges = orangeFuture.get();
return [compare apples and oranges];
}
}
При использовании @Async
, открытый метод в классе FruitClient
должен вернуть Future
. Я предпочитаю, что это не так. Я думаю, что для вызывающего этого метода лучше решить, должен ли вызов быть асинхронным.
Но я бы что-то упустил, если бы не использовал @Async
? Похоже, что он не сокращает количество необходимых строк кода.
Примечание. Похоже, этот вопрос задавался раньше , но ни один из приведенных ответов на самом деле не отвечает на этот вопрос.