В чем преимущество использования аннотации Spring AsAsc? - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь выполнять асинхронные вызовы из веб-службы 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? Похоже, что он не сокращает количество необходимых строк кода.

Примечание. Похоже, этот вопрос задавался раньше , но ни один из приведенных ответов на самом деле не отвечает на этот вопрос.

...