3

I am trying to instantiate multiple SimpleMessageListenerContainer and define custom TaskExecutor for independent MessageListener queues, The reason for this setup is I don't want to create a shared SimpleMessageListenerContainer where thread pool configuration is shared across all Message Listener queues.

Can you please provide a suggestion? I tried following some of the spring-messaging-aws test case approach but doesn't seem to be working?

@Bean
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory() {
    SimpleMessageListenerContainerFactory msgListenerContainerFactory = new SimpleMessageListenerContainerFactory();
    msgListenerContainerFactory.setAmazonSqs(amazonSQSClient());
    return msgListenerContainerFactory;
}

@Bean
public SimpleMessageListenerContainer uplinkMessageListenerContainer() throws Exception {
    SimpleMessageListenerContainer msgListenerContainer = simpleMessageListenerContainerFactory().createSimpleMessageListenerContainer();
    msgListenerContainer.setAmazonSqs(amazonSQSClient());
    QueueMessageHandler messageHandler = new QueueMessageHandler();
    msgListenerContainer.setMessageHandler(messageHandler);
    StaticApplicationContext applicationContext = new StaticApplicationContext();
    applicationContext.registerSingleton("uplinkMessageListener", UplinkMessageListener.class);

    messageHandler.setApplicationContext(applicationContext);
    msgListenerContainer.setBeanName("testContainerName");
    messageHandler.afterPropertiesSet();
    msgListenerContainer.setMaxNumberOfMessages(maxNumberOfmessages);
    msgListenerContainer.setWaitTimeOut(waitTimeout);
    msgListenerContainer.setBackOffTime(backOfTime);
    msgListenerContainer.setAutoStartup(sqsAutoStartup);
    msgListenerContainer.setVisibilityTimeout(visibilityTimeout);
    msgListenerContainer.setTaskExecutor(createDefaultTaskExecutor("MPSQSUplinkMessageListener", 2, 10));
    msgListenerContainer.afterPropertiesSet();
    msgListenerContainer.start();
    return msgListenerContainer;
}
MujtabaFR
  • 5,956
  • 6
  • 40
  • 66
Santhosh
  • 31
  • 4

1 Answers1

0

I couldn't find a better solution than creating a service with Scheduler.

@Component
public class AmazonService {

  @Scheduled("0 */5 * * * *")
  public void checkSqs() {
     // Check sqs
  }
}

SQS will be instantiated either by a lazy mechanism or via a constructor in the service.

Dmytro Chasovskyi
  • 3,209
  • 4
  • 40
  • 82