We are using JMS library for consuming SQS messages. UNORDERED_ACKNOWLEDGEMENT was working fine till concurrency was not into picture.
However for concurrency when I injected following bean, all my messages in SQS listener have acknowledgement mode set to 2.
@Bean("sqs-container-factory")
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(
SQSConnectionFactory sqsConnectionFactory) {
final DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(sqsConnectionFactory);
factory.setDestinationResolver(new DynamicDestinationResolver());
factory.setConcurrency(this.concurrencyMinMax);
factory.setSessionAcknowledgeMode(SQSSession.UNORDERED_ACKNOWLEDGE);
factory.setTaskExecutor(this.createDefaultTaskExecutor());
return factory;
}
This is how my listener looks like –
@JmsListener(destination = "${aws.event.sqs}", containerFactory = "sqs-container-factory")
public void onMessage(Message message) throws JMSException {
log.info("Inside SQS listener {}", message.getJMSDeliveryMode());
if (message instanceof SQSTextMessage textMessage) {
}}
For our use case we required UNORDERED_ACKNOWLEDGEMENT mode only. As there can be some messages who would genuinely require retries with SQS. We are using SQS for retry.
How can I fix this?
Earlier when I created session using following code, everything worked fine –
SQSConnection connection = sqsConnectionFactory.createConnection();
Session session = connection.createSession(false, SQSSession.UNORDERED_ACKNOWLEDGE);
Queue queue = session.createQueue(queueName);
MessageConsumer consumer = session.createConsumer(queue);
consumer.setMessageListener(listener);