I'm trying to refactor some legacy code to use Spring to handle the jms connections to a mainframe service. I need to connect create a temporary topic for the mainframe service reply and set that as the message.setJMSReplyTo(replyTo);
in the message before I send the message.
Can anyone provide examples of this? I have not found anything in the documentation that allows you to get to the low level jms objects such as the session or TopicConnection in order to create a temporary topic.
If you need low-level access to the JMS API using JmsTemplate
, then you need to use one of JmsTemplate's execute(...)
methods. The simplest of these is execute(SessionCallBack)
, where the SessionCallback provides you with the JMS Session object. With that, you can call createTemporaryQueue()
or createTemporaryTopic()
. You can probably use one of the other execute() methods do some of the initial work for you, though, such as this one.
I was able to create a queue dynamically using the following code in a Spring Boot app:
In Application.java
@Bean
public ConnectionFactory jmsFactory()
{
ActiveMQConnectionFactory amq = new ActiveMQConnectionFactory()
amq.setBrokerURL("tcp://somehost");
return amq;
}
@Bean
public JmsTemplate myJmsTemplate()
{
JmsTemplate jmsTemplate = new JmsTemplate(jmsFactory());
jmsTemplate.setPubSubDomain(false);
return jmsTemplate;
}
Then in another class which creates the queue dynamically:
@Component
public class Foo {
@Autowired
private ConnectionFactory jmsFactory;
public void someMethod () {
DefaultMessageListenerContainer messageListener = new DefaultMessageListenerContainer();
messageListener.setDestinationName("queueName");
messageListener.setConnectionFactory(jmsFactory);
messageListener.setMessageListener(new Consumer("queueName"));
messageListener.setPubSubDomain(false);
messageListener.initialize();
messageListener.start();
}
}