Spring Boot中的任务执行器

时间:2015-08-30 08:48:35

标签: java spring spring-boot amazon-sqs

在我的Spring Boot应用程序中,我正在监听消息队列。当出现消息时,我需要在某个任务执行器中执行同步(逐个)。

我使用的是亚马逊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一起使用。

1 个答案:

答案 0 :(得分:1)

修改

在显示您的消息传递技术和Spring配置之后,最简单的方法是将SyncTaskExecutor(或Executors.newFixedThreadPool(1)也可以完成工作)配置为DefaultMessageListenerContainer的执行者。 Use this method

您可以将Task executor注册为单独的bean(通过@Bean注释)并将其自动装配到defaultMessageListenerContainer()方法(只需添加TaskExectuor作为参数)。

以下答案与JMS消息传递相关。它是在AWS SQS使用被揭示之前创建的:

您没有提到您正在使用哪种消息传递技术,因此我假设JMS。

如果需要同步执行,我相信您无法使用本机JMS侦听器(需要避免使用SimpleJmsListenerContainerFactorySimleMessageListenerContainer)。

相反,我建议使用@JmsListener注释DefaultJmsListenerContainerFactory(这使用长轮询而不是本机JMS侦听器)并配置SyncTaskExecutor(或Executors.newFixedThreadPool(1)可以完成工作另外)作为上述集装箱工厂的执行人:DefaultJmsListenerContainerFactory.setTaskExecutor()

This is simple Spring Boot JMS example with DefaultJmsListenerContainerFactory configured。你只需要插入合适的任务执行器。