问题
I create a basic workflow of consuming messages from SQS
with @SqsListener
. It works fine but I constantly get tons of similar messages:
org.springframework.core.task.TaskRejectedException: Executor [java.util.concurrent.ThreadPoolExecutor@372b568[Running, pool size = 3, active threads = 3, queued tasks = 0, completed tasks = 0]] did not accept task: org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer$SignalExecutingRunnable@4c30c2f9 at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.execute(ThreadPoolTaskExecutor.java:317) ~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE] at org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer$AsynchronousMessageListener.run(SimpleMessageListenerContainer.java:286) ~[spring-cloud-aws-messaging-2.1.0.RELEASE.jar:2.1.0.RELEASE] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_171] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_171] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_171] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_171] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_171] Caused by: java.util.concurrent.RejectedExecutionException: Task org.springframework.cloud.aws.messaging.listener.SimpleMessageListenerContainer$SignalExecutingRunnable@4c30c2f9 rejected from java.util.concurrent.ThreadPoolExecutor@372b568[Running, pool size = 3, active threads = 3, queued tasks = 0, completed tasks = 0] at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063) ~[na:1.8.0_171] at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830) [na:1.8.0_171] at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379) [na:1.8.0_171] at org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.execute(ThreadPoolTaskExecutor.java:314) ~[spring-context-5.1.4.RELEASE.jar:5.1.4.RELEASE] ... 6 common frames omitted
My configuration bean:
@EnableSqs
@Configuration
public class AmazonSqsConfiguration {
@Value("${aws.sqs.accessKey}")
private String accessKey;
@Value("${aws.sqs.secretKey}")
private String secretKey;
@Value("${aws.sqs.region}")
private String region;
@Value("${aws.sqs.url}")
private String url;
@Bean
public AmazonSQSAsync amazonSqs() {
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
AWSStaticCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials);
return AmazonSQSAsyncClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(url, region))
.withCredentials(credentialsProvider)
.build();
}
}
My consumer is the following:
@SqsListener(value = "my-queue", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
public void processSubscription(String xmlNotification) {/* Message processor */}
Is it possible to remove them by re configuring @Bean
? What is the root cause of the issue and how to fight with it?
I tried to find solution by natural search and encountered with the following answer. It doesn't work for me, since I don't have JMS
. I couldn't debug because I don't even know what to debug.
回答1:
I found ticket for spring-cloud-aws related to the behavior I encountered. I also, find relevant StackOverflow question.
Therefore, solution that worked for me was the following:
@Bean
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(AmazonSQSAsync amazonSQS) {
SimpleMessageListenerContainerFactory factory = new SimpleMessageListenerContainerFactory();
factory.setAmazonSqs(amazonSQS);
factory.setMaxNumberOfMessages(10);
factory.setAutoStartup(true);
factory.setWaitTimeOut(20);
return factory;
}
来源:https://stackoverflow.com/questions/55216527/org-springframework-core-task-taskrejectedexception-while-listening-for-sqs-queu