Java Spring Boot中的任务执行器

Java Spring Boot中的任务执行器,java,spring,spring-boot,amazon-sqs,Java,Spring,Spring Boot,Amazon Sqs,在我的Spring Boot应用程序中,我正在侦听消息队列。当消息出现时,我需要在某个任务执行器中同步执行它 我使用的是Amazon SQS,这是我的配置: /** * AWS Credentials Bean */ @Bean public AWSCredentials awsCredentials() { return new BasicAWSCredentials(accessKey, secretAccessKey);

在我的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
的执行器

您可以将TaskExecutor注册为单独的bean(通过@bean注释),并将其自动连接到
defaultMessageListenerContainer()
方法(只需将
TaskExecutor
添加为参数)


下面的答案与JMS消息传递相关。它是在AWS SQS使用出现问题之前创建的:

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

如果需要同步执行,我相信您不能使用本机JMS侦听器(需要避免
SimpleJMListenerContainerFactory
SimleMessageListenerContainer

相反,我建议将
@JmsListener
注释与
DefaultJmsListenerContainerFactory
(这使用长轮询而不是本机JMS侦听器)一起使用,并配置
SyncTaskExecutor
(或
执行器。newFixedThreadPool(1)
也可以完成此任务)作为上述容器工厂的执行者:
DefaultJmsListenerContainerFactory.setTaskExecutor()


。您只需插入合适的任务执行器。

谢谢您的回答!我使用的是AWS SQSI,我在问题中添加了我的SQS配置