Как я могу достичь UNORDER_ACKNOWLEDGMENT с помощью Spring JMSJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как я могу достичь UNORDER_ACKNOWLEDGMENT с помощью Spring JMS

Сообщение Anonymous »

В моем весеннем приложении есть несколько слушателей. Я заметил, что при развертывании приложения довольно редко вижу следующее сообщение:

Код: Выделить всё

Rejecting received message because of the listener container having been stopped in the meantime. 
И мы видим рост DLQ. Текущий режим подтверждения установлен по умолчанию (то есть автоматическое подтверждение). Я хочу изменить это на подтверждение клиента и контролировать подтверждение.
У меня настроены следующие bean-компоненты:

Код: Выделить всё

@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(SQSConnectionFactory sqsConnectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(sqsConnectionFactory);
factory.setDestinationResolver(new DynamicDestinationResolver());
factory.setErrorHandler(this::handleError);
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return factory;
}

@Bean
public JmsTemplate jmsTemplate(SQSConnectionFactory sqsConnectionFactory) {
return new JmsTemplate(sqsConnectionFactory);
}

@Bean
public AmazonSQS buildAmazonSqs() {
return AmazonSQSClientBuilder.standard().withRegion(region).build();
}

@Bean
public SQSConnectionFactory sqsConnectionFactory(AmazonSQS amazonSQS) {
return new SQSConnectionFactory(
new ProviderConfiguration().withNumberOfMessagesToPrefetch(1),
amazonSQS);
}
Но после нескольких экспериментов я заметил, что даже когда message.acknowledge(); не выполняется для принимающего объекта в моем JMSListener, сообщение все равно извлекается из очереди. Он не возвращается в очередь. И, посмотрев на datadog и увидев трассировку, я вижу за кулисами, что сообщение удаляется из очереди. Даже замена Session.CLIENT_ACKNOWLEDGME на SQSSession.UNORDERED_ACKNOWLEDGE, разницы нет.
Причина, по которой я хочу использовать UNORDERED_ACKNOWLEDGMENT, заключается в том, что использование CLIENT_ACKNOWLEDGMENT будет подтверждать предыдущие сообщения, как описано здесь.
Придется ли мне по существу использовать @SqsListener вместо @JmsListener Spring? Если нет, то как я могу запретить Spring подтверждать сообщение без вызова подтверждения() для объекта получающего сообщения?

Подробнее здесь: https://stackoverflow.com/questions/785 ... spring-jms
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»