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
?
destination="${name.of.your.property}"
. – GillespiePropertyPlaceHolderConfiguration
in favor ofEnvironment.getProperty
but clearly I can't take that route as a parameter to an annotation. – PatricPropertySourcePlaceHolderConfigurer
which basically does the same asEnvironment.getProperty
does (it consults allPropertySource
s. Could you elaborate why you would prefer theEnvironment.getProperty
over the placeholder in this case? – Gillespie@PropertySource
in@Configuration
beans was the latest recommended way to read from configuration. I was trying for a "no XML" approach. – Patric@PropertySource
wouldn't work with a placeholder? It works the same. The only difference is that you need to use aPropertySourcesPlaceHolderConfigurer
. So that fact of using a placeholder doesn't mean you cannot use@PropertySource
anymore. – Gillespie@Configuration
beans with@PropertySource
. It's trivial to setup the Placeholder and I don't have a problem doing so, but not only is it redundant it seems like I should be able to set the destination in a way that does not require the destination to be passed in via annotation. What if I wanted to determine the destination dynamically at runtime? Thanks, @Stéphane Nicoll. – Patric