Rob
Rob

Reputation: 255

Creating temporary JMS jms topic in Spring

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.

Upvotes: 3

Views: 4806

Answers (2)

Steve Wall
Steve Wall

Reputation: 1932

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();
    }
}

Upvotes: 1

skaffman
skaffman

Reputation: 403501

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.

Upvotes: 2

Related Questions