I am defining a message listener similar to what is defined below. The messages are query statements. The messages are pushed in a sequence into the queue so that it doesn't violate any foreign key rules when pushed to the tables. When I set the maxnumberofmessages to 10 , I see that the queries seem to be executed out of order. However when I set it to 1 , I don't see any issues. How can ensure the messages are read in the same sequence as they are in the queue when I set maxnumberofmessages to a higher value than 1?
@Bean
public SimpleMessageListenerContainer simpleMessageListenerContainer(AmazonSQSAsync amazonSQSAsync) {
SimpleMessageListenerContainer simpleMessageListenerContainer = new SimpleMessageListenerContainer();
simpleMessageListenerContainer.setAmazonSqs);
simpleMessageListenerContainer.setMessageHandler(queueMessageHandler());
simpleMessageListenerContainer.setMaxNumberOfMessages(10);
return simpleMessageListenerContainer;
}
@SqsListener(value = "${sqs.url}", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
public void onMessage(String serviceData, @Header("MessageId") String messageId, @Header("ApproximateFirstReceiveTimestamp") String approximateFirstReceiveTimestamp) {
repository.execute(serviceData);
}
Modified Code
@Bean
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory() {
SimpleMessageListenerContainerFactory msgListenerContainerFactory = new SimpleMessageListenerContainerFactory();
msgListenerContainerFactory.setAmazonSqs(amazonSQSAsyncClient());
msgListenerContainerFactory.setAutoStartup(false);
msgListenerContainerFactory.setMaxNumberOfMessages(10);
msgListenerContainerFactory.setTaskExecutor(threadPoolTaskExecutor());
return msgListenerContainerFactory;
}
@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(1);
executor.setMaxPoolSize(1);
executor.setThreadNamePrefix("queueExecutor");
executor.initialize();
return executor;
}
@SqsListener(value = "${sqs.url}", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
public void onMessage(String serviceData, @Header("MessageId") String messageId, @Header("ApproximateFirstReceiveTimestamp") String approximateFirstReceiveTimestamp) {
repository.execute(serviceData);
}