[原創]深入掌握JMS(十一):TemporaryQueue和TemporaryTopic

21ca發表於2009-04-13
    TemporaryQueue和TemporaryTopic,從字面上就可以看出它們是“臨時”的目的地。可以通過Session來建立,例如:
    TemporaryQueue replyQueue = session.createTemporaryQueue();
    
    雖然它們是由Session來建立的,但是它們的生命週期確實整個Connection。如果在一個Connection上建立了兩個Session,則一個Session建立的TemporaryQueue或TemporaryTopic也可以被另一個Session訪問。那如果這兩個Session是由不同的Connection建立,則一個Session建立的TemporaryQueue不可以被另一個Session訪問。
    另外,它們的主要作用就是用來指定回覆目的地, 即作為JMSReplyTo。
    在下面的例子中,先建立一個Connection,然後建立兩個Session,其中一個Session建立了一個TemporaryQueue,另一個Session在這個TemporaryQueue上讀取訊息。
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;

public class TemporaryQueueTest {

    public static void main(String[] args) throws Exception {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
        Connection connection = factory.createConnection();
        connection.start();

        Queue queue = new ActiveMQQueue("testQueue2");
        final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //使用session建立一個TemporaryQueue。
        TemporaryQueue replyQueue = session.createTemporaryQueue();
       
        //接收訊息,並回復到指定的Queue中(即replyQueue)
        MessageConsumer comsumer = session.createConsumer(queue);
        comsumer.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    System.out.println("Get Message: " + ((TextMessage)m).getText());
                    MessageProducer producer = session.createProducer(m.getJMSReplyTo());
                    producer.send(session.createTextMessage("ReplyMessage"));
                } catch (JMSException e) { }
            }
        });
       
        //使用同一個Connection建立另一個Session,來讀取replyQueue上的訊息。
        Session session2 = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
        MessageConsumer replyComsumer = session2.createConsumer(replyQueue);
        replyComsumer.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    System.out.println("Get reply: " + ((TextMessage)m).getText());
                } catch (JMSException e) { }
            }
        });
       
        MessageProducer producer = session.createProducer(queue);
        TextMessage message = session.createTextMessage("SimpleMessage");
        message.setJMSReplyTo(replyQueue);
        producer.send(message);
    }
}

執行結果為:
Get Message: SimpleMessage
Get reply: ReplyMessage

如果將:
 Session session2 = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
更改為:
 Connection connection2 = factory.createConnection();
 Session session2 = connection2.createSession(true, Session.AUTO_ACKNOWLEDGE);
就會得到類似於下面的異常:
Exception in thread "main" javax.jms.InvalidDestinationException: Cannot use a Temporary destination from another Connection。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10742815/viewspace-588791/,如需轉載,請註明出處,否則將追究法律責任。

相關文章