Я пытаюсь понять поведение SqsMessageDrivenChannelAdapter
для решения проблемы с памятью.Исходящая система сбрасывает тысячи сообщений в aws-sqs-queue
, все сообщения немедленно принимаются SqsMessageDrivenChannelAdapter
.На консоли AWS я не вижу сообщений, доступных в очереди.SqsMessageProcesser
затем обрабатывает 1 сообщение каждые 5 секунд.
Вот журнал:
2019-05-21 17:28:18 INFO SQSMessageProcessor: 88 - --- inside 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 ИНФОРМАЦИЯ SQSMessageProcessor: 88 - --- внутри sqsMessageProcesser --- .........................
Означает ли это, что пока SqsMessageProcesser
обрабатывает 1 сообщение каждые 5 секунд, тысячи сообщений хранятся в (серверной) памяти in-channel
?
Каждая дБ-транзакция занимает около 5 секунд, и в настоящее время мы сталкиваемся с проблемами внеочередности в PRD.
Поможет ли мне установить емкость на QueueChannel
и setMaxNumberOfMessages
для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.
}