Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring 4.1 @JmsListener configuration

I would like to use the new annotations and features provided in Spring 4.1 for an application that needs a JMS listener.

I've carefully read the notes in the Spring 4.1 JMS improvements post but I continue to miss the relationship between @JmsListener and maybe the DestinationResolver and how I would setup the application to indicate the proper Destination or Endpoint.

Here is the suggested use of @JmsListener

@Component
public class MyService {

    @JmsListener(containerFactory = "myContainerFactory", destination = "myQueue")
    public void processOrder(String data) { ... }
}

Now, I can't use this in my actual code because the "myQueue" needs to be read from a configuration file using Environment.getProperty().

I can setup an appropriate myContainerFactory with a DestinationResolver but mostly, it seems you would just use DynamicDestinationResolver if you don't need JNDI to lookup a queue in an app server and didn't need to do some custom reply logic. I'm simply trying to understand how Spring wants me to indicate the name of the queue in a parameterized fashion using the @JmsListener annotation.

Further down the blog post, I find a reference to this Configurer:

@Configuration
@EnableJms
public class AppConfig implements JmsListenerConfigurer {

@Override
public void configureJmsListeners(JmsListenerEndpointRegistrar registrar) {
    registrar.setDefaultContainerFactory(defaultContainerFactory());

    SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
    endpoint.setDestination("anotherQueue");
    endpoint.setMessageListener(message -> {
        // processing
    });
    registrar.registerEndpoint(endpoint);
}

Now, this makes some amount of sense and I could see where this would allow me to set a Destination at runtime from some external string, but this seems to be in conflict with using @JmsListener as it appears to be overriding the annotation in favor of endpoint.setMessageListener in the code above.

Any tips on how to specify the appropriate queue name using @JmsListener?

like image 907
TemarV Avatar asked Sep 17 '14 20:09

TemarV


2 Answers

Also note that depending on use case you can already parameterize using properties file per environment and PropertySourcesPlaceholderConfigurer

@JmsListener(destinations = "${some.key}")

As per https://jira.spring.io/browse/SPR-12289

like image 53
GameSalutes Avatar answered Nov 16 '22 02:11

GameSalutes


In case people are using @JmsListener with spring boot, you do not have to configure PropertySourcesPlaceholderConfigurer. It work's out the box

Sample:

class

@JmsListener(destination = "${spring.activemq.queue.name}")
    public void receiveEntityMessage(final TextMessage message) {
    // process stuff 
}
}

application.properties

spring.activemq.queue.name=some.weird.queue.name.that.does.not.exist

Spring boot output

[26-Aug;15:07:53.475]-[INFO ]-[,]-[DefaultMes]-[o.s.j.l.DefaultMessageListenerContainer ]-[931 ]-Successfully refreshed JMS Connection 
[26-Aug;15:07:58.589]-[WARN ]-[,]-[DefaultMes]-[o.s.j.l.DefaultMessageListenerContainer ]-[880 ]-Setup of JMS message listener invoker failed for destination 'some.weird.queue.name.that.does.not.exist' - trying to recover. Cause: User user is not authorized to read from some.weird.queue.name.that.does.not.exist 
[26-Aug;15:07:59.787]-[INFO ]-[,]-[DefaultMes]-[o.s.j.l.DefaultMessageListenerContainer ]-[931 ]-Successfully refreshed JMS Connection 
[26-Aug;15:08:04.881]-[WARN ]-[,]-[DefaultMes]-[o.s.j.l.DefaultMessageListenerContainer ]-[880 ]-Setup of JMS message listener invoker failed for destination 'some.weird.queue.name.that.does.not.exist' - trying to recover. Cause: User user is not authorized to read from some.weird.queue.name.that.does.not.exist 

This proves that @JmsListener is able to pickup property values from application.properties without actually setting up any explicit PropertySourcesPlaceholderConfigurer

I hope this helps!

like image 44
shahshi15 Avatar answered Nov 16 '22 02:11

shahshi15