Spring Boot 中的任务执行器
Task executor in Spring Boot
在我的 Spring 引导应用程序中,我正在侦听消息队列。当一条消息出现时,我需要在某个任务执行器中同步(一个接一个)执行它。
我正在使用 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
。 Use this method.
您可以将任务执行器注册为单独的 bean(通过 @Bean 注释)并将其自动装配到 defaultMessageListenerContainer()
方法(只需添加 TaskExectuor
作为参数)。
以下答案与 JMS 消息传递相关。它是在有问题的 AWS SQS 使用被披露之前创建的:
您没有提到您使用的是哪种消息传递技术,因此我假设是 JMS。
如果需要同步执行,我相信你不能使用本机 JMS 侦听器(需要避免 SimpleJmsListenerContainerFactory
或 SimleMessageListenerContainer
)。
相反,我建议使用带有 DefaultJmsListenerContainerFactory
的 @JmsListener
注释(这使用长轮询而不是本机 JMS 侦听器)并配置 SyncTaskExecutor
(或者 Executors.newFixedThreadPool(1)
会做这份工作也)作为上述集装箱工厂的执行人:DefaultJmsListenerContainerFactory.setTaskExecutor()
.
This is simple Spring Boot JMS example with DefaultJmsListenerContainerFactory configured。您只需要插入合适的任务执行器即可。
在我的 Spring 引导应用程序中,我正在侦听消息队列。当一条消息出现时,我需要在某个任务执行器中同步(一个接一个)执行它。
我正在使用 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
。 Use this method.
您可以将任务执行器注册为单独的 bean(通过 @Bean 注释)并将其自动装配到 defaultMessageListenerContainer()
方法(只需添加 TaskExectuor
作为参数)。
以下答案与 JMS 消息传递相关。它是在有问题的 AWS SQS 使用被披露之前创建的:
您没有提到您使用的是哪种消息传递技术,因此我假设是 JMS。
如果需要同步执行,我相信你不能使用本机 JMS 侦听器(需要避免 SimpleJmsListenerContainerFactory
或 SimleMessageListenerContainer
)。
相反,我建议使用带有 DefaultJmsListenerContainerFactory
的 @JmsListener
注释(这使用长轮询而不是本机 JMS 侦听器)并配置 SyncTaskExecutor
(或者 Executors.newFixedThreadPool(1)
会做这份工作也)作为上述集装箱工厂的执行人:DefaultJmsListenerContainerFactory.setTaskExecutor()
.
This is simple Spring Boot JMS example with DefaultJmsListenerContainerFactory configured。您只需要插入合适的任务执行器即可。