我试图了解SqsMessageDrivenChannelAdapter
解决内存问题的行为。上游系统转储了数千条消息aws-sqs-queue
,所有消息都被立即接收SqsMessageDrivenChannelAdapter
。在 AWS 控制台上,我看不到队列中的任何可用消息。然后SqsMessageProcesser
每 5 秒处理 1 条消息。
这是日志:
2019-05-21 17:28:18 INFO SQSMessageProcessor:88 - --- sqsMessageProcesser 内部--- 2019-05-21 17:28:23 INFO SQSMessageProcessor:88 - --- sqsMessageProcesser 内部--- 2019-05- 21 17:28:28 INFO SQSMessageProcessor:88 - --- sqsMessageProcesser 内部--- 2019-05-21 17:28:33 INFO SQSMessageProcessor:88 --- sqsMessageProcesser 内部--- 2019-05-21 17:28 :38 INFO SQSMessageProcessor:88 - --- 在 sqsMessageProcesser 内--- ...................
这是否意味着在SqsMessageProcesser
每 5 秒处理 1 条消息时,数千条消息被保存在 ? 的(服务器)内存中in-channel
?
每个数据库事务大约需要 5 秒,目前我们在 PRD 上面临“内存不足”问题。
如果我在QueueChannel
andsetMaxNumberOfMessages
上设置容量会有帮助SqsMessageDrivenChannelAdapter
吗?如果是,是否有计算这些值的标准方法?
@Bean(name = "in-channel")
public PollableChannel sqsInputChannel() {
return new QueueChannel();
}
@Autowired
private AmazonSQSAsync amazonSqs;
@Bean
public MessageProducer sqsMessageDrivenChannelAdapterForItems() {
SqsMessageDrivenChannelAdapter adapter =
new SqsMessageDrivenChannelAdapter(amazonSqs, "aws-sqs-queue");
adapter.setOutputChannelName("in-channel");
return adapter;
}
@ServiceActivator(inputChannel = "in-channel",
poller = @Poller(fixedRate = "5000" , maxMessagesPerPoll = "1"))
public void sqsMessageProcesser(Message<?> receive) throws ProcesserException {
logger.info("--- inside sqsMessageProcesser---")
// db transactions.
}