我有一个SpringBoot应用程序,它在预处理后将消息发送到3个单独的SQS队列,并同时使用它们以根据队列分别进行进一步处理。
我们会定期收到此错误,最终导致应用程序失败。
2020-01-07 19:44:32.484 [ConsumerPrefetchThread-1] ERROR c.a.s.j.SQSMessageConsumerPrefetch - Unexpected exception when prefetch messages: java.lang.OutOfMemoryError: Java heap space
这就是全部信息。
我们已将队列侦听器的数量配置为5;我们有3个队列;在分析过程中,我看到创建了7个ConsumerPrefetchThread
。这是预期的吗?
从SQS甚至一般的角度来看, 是什么原因导致OOM错误? 我愿意接受任何理论!
build.gradle中的相关依赖项:
- org.springframework:spring-jms:5.1.1.RELEASE
- com.amazonaws:aws-java-sdk-sqs:1.11.428
- com.amazonaws:amazon-sqs-java-messaging-lib:1.0.4
SQSConfiguration.java中的代码段
@Bean
public SQSConnectionFactory sqsConnectionFactory() {
try {
AmazonSQSClientBuilder.defaultClient()
.getQueueUrl({This is the queue url});
}
catch (Exception ex) {
throw new ApplicationLoadingException(
"SQS settings error: " + ex.getStackTrace());
}
return new SQSConnectionFactory(new ProviderConfiguration(),AmazonSQSClientBuilder.defaultClient());
}
@Bean
public JmsTemplate jmsTemplate() {
JmsTemplate template = new JmsTemplate();
template.setConnectionFactory(sqsConnectionFactory());
return template;
}
这是SQSClient.java的代码片段
@PostConstruct
public void init() {
sqsClient = AmazonSQSClientBuilder.defaultClient();
}
@Retryable(value = {
SdkClientException.class },maxAttempts = 3,backoff = @Backoff(delay = 30000))
public void sendMessage(String queue,String message,int delayInminutes) {
SendMessageRequest request = new SendMessageRequest(
sqsClient.getQueueUrl(queue).getQueueUrl(),message);
request.withDelaySeconds(delayInminutes * 60);
sqsClient.sendMessage(request);
}