簡體   English   中英

Spring Boot中的任務執行器

[英]Task executor in Spring Boot

在我的Spring Boot應用程序中,我正在偵聽消息隊列。 當出現一條消息時,我需要在某些任務執行器中同步執行該操作(一個接一個)。

我正在使用Amazon SQS,這是我的配置:

    /**
     * AWS Credentials Bean
     */
    @Bean
    public AWSCredentials awsCredentials() {
        return new BasicAWSCredentials(accessKey, secretAccessKey);
    }

    /**
     * AWS Client Bean
     */
    @Bean
    public AmazonSQS amazonSQSAsyncClient() {
        AmazonSQS sqsClient = new AmazonSQSClient(awsCredentials());
        sqsClient.setRegion(Region.getRegion(Regions.US_EAST_1));
        return sqsClient;
    }

    /**
     * AWS Connection Factory
     */
    @Bean
    public SQSConnectionFactory connectionFactory() {
        SQSConnectionFactory.Builder factoryBuilder = new SQSConnectionFactory.Builder(
                Region.getRegion(Regions.US_EAST_1));
        factoryBuilder.setAwsCredentialsProvider(new AWSCredentialsProvider() {

            @Override
            public AWSCredentials getCredentials() {
                return awsCredentials();
            }

            @Override
            public void refresh() {
            }

        });
        return factoryBuilder.build();
    }

    /**
     * Registering QueueListener for queueName
     */
    @Bean
    public DefaultMessageListenerContainer defaultMessageListenerContainer() {
        DefaultMessageListenerContainer messageListenerContainer = new DefaultMessageListenerContainer();
        messageListenerContainer.setConnectionFactory(connectionFactory());
        messageListenerContainer.setMessageListener(new MessageListenerAdapter(new QueueListener()));
        messageListenerContainer.setDestinationName(queueName);

        return messageListenerContainer;
    }

另外,我還需要檢查此任務執行器的狀態,例如-計划任務的數量。

為此目的使用Spring SyncTaskExecutor是個好主意嗎? 如果是這樣,請您舉例說明如何將其與Spring Boot結合使用。

編輯:

揭示了消息傳遞技術和Spring的配置之后,最簡單的方法是將SyncTaskExecutor (或Executors.newFixedThreadPool(1)也可以完成此工作)配置為DefaultMessageListenerContainer執行者。 使用此方法

您可以將Task executor注冊為單獨的bean(通過@Bean批注),並將其自動連接到defaultMessageListenerContainer()方法(只需將TaskExectuor添加為參數)。


下面的答案與JMS消息傳遞有關。 它是在有問題的AWS SQS使用情況披露之前創建的:

您沒有提到要使用哪種消息傳遞技術,因此我假設使用JMS。

如果需要同步執行,我相信您不能使用本機JMS偵聽器(需要避免SimpleJmsListenerContainerFactorySimleMessageListenerContainer )。

相反,我建議將@JmsListener批注與DefaultJmsListenerContainerFactory (這將使用長輪詢而不是本機JMS偵聽器)一起使用,並配置SyncTaskExecutor (或Executors.newFixedThreadPool(1)也會執行此工作)作為上述容器工廠的執行者: DefaultJmsListenerContainerFactory.setTaskExecutor()

這是配置了DefaultJmsListenerContainerFactory的簡單Spring Boot JMS示例 您只需要插入合適的任務執行器即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM