Java Spring Boot中的任务执行器
在我的Spring Boot应用程序中,我正在侦听消息队列。当消息出现时,我需要在某个任务执行器中同步执行它 我使用的是Amazon SQS,这是我的配置: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);
/**
* 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;
}
此外,我需要有可能检查这个任务执行者的状态,例如-计划任务的数量
为此目的使用SpringSyncTaskExecutor
是一个好主意吗?如果是这样,请举例说明如何将其用于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配置