spring-attic / spring-cloud-aws

All development has moved to https://github.com/awspring/spring-cloud-aws Integration for Amazon Web Services APIs with Spring
https://awspring.io/
Apache License 2.0
590 stars 373 forks source link

SimpleMessageListenerContainerFactory doesn't propagate queueMessageHandler field when SimpleMessageListenerContainer bean is created via createSimpleMessageListenerContainer #795

Open setu9760 opened 2 years ago

setu9760 commented 2 years ago

Type: Bug

Component: SQS messaging

Describe the bug SimpleMessageListenerContainerFactory has queueMessageHandler field and has setter for this. However when public method createSimpleMessageListenerContainer is called to create the actual bean SimpleMessageListenerContainer this field is not propagated. Ideally for the factory bean we would want all the relevant properties/fields propagated to the underlying bean without having to manually inject it twice in factory and then the underlying bean.

Sample

  @Bean
  @Primary
  public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(
      QueueMessageHandler queueMessageHandler, AmazonSQSAsync amazonSqs) {
    var factory = new SimpleMessageListenerContainerFactory();
    factory.setQueueMessageHandler(queueMessageHandler);
    factory.setAmazonSqs(amazonSqs);
    factory.setAutoStartup(true);
    factory.setMaxNumberOfMessages(1);
    return factory;
  }

  @Bean
  @Primary
  public SimpleMessageListenerContainer simpleMessageListenerContainer(
      SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory,
      QueueMessageHandler queueMessageHandler) {
    var simpleMessageListenerContainer= simpleMessageListenerContainerFactory.createSimpleMessageListenerContainer();
    simpleMessageListenerContainer.setMessageHandler(queueMessageHandler);
    return simpleMessageListenerContainer;
  }

in the above code the simpleMessageListenerContainer.setMessageHandler(queueMessageHandler); line shouldn't be required and the call simpleMessageListenerContainerFactory.createSimpleMessageListenerContainer() should ensure all fields from factory are injected into the bean.