[原創]深入掌握JMS(十一):TemporaryQueue和TemporaryTopic
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。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [原創]深入掌握JMS(四):實戰Queue
- [原創]深入掌握JMS(五):實戰Topic
- [原創]深入掌握JMS(七):DeliveryMode例子
- [原創] 深入掌握JMS(一):JSM基礎JS
- 深入淺出JMS(一)——JMS簡單介紹
- 【原創】淺談指標(十一)alloca函式指標函式
- Oracle中Hint深入理解(原創)Oracle
- 深入掌握service
- 【原創】ORACLE 深入解析10053事件Oracle事件
- 【原創】彼得德魯克《管理的實踐》札記(十一)
- webservice和jms的區別Web
- Hollis原創|深入分析Java的編譯原理Java編譯原理
- (原創)建立windows域—深入理解域概念薦Windows
- 【原創】Linux虛擬化KVM-Qemu分析(十一)之virtqueueLinux
- 深入理解javascript系列(十一):thisJavaScript
- JMS學習(一):初識JMS
- 【原創】【深入淺出系列】之程式碼可讀性
- 深入掌握Java中的enumJava
- 【原創】Oracle RAC原理和安裝Oracle
- 【原創】oracle spfile和pfile小結Oracle
- 深入掌握K8S PodK8S
- JMS和AMQP有什麼區別嗎MQ
- [原創]ETL效能測試和優化優化
- 訊息佇列之JMS和AMQP對比佇列MQ
- 深入C++06:深入掌握OOP最強大的機制C++OOP
- 站在彙編角度深入瞭解 Swift(十一)Swift
- [原創]DevOps 的技術棧和工具dev
- jms過濾器過濾器
- Spring Cloud Hystrix原碼篇(十一)SpringCloud
- 深入淺出Java多執行緒(十一):AQSJava執行緒AQS
- Activemq和Lingo實現JMS和非同步呼叫(轉)MQGo非同步
- 掌握這些技巧,角色原畫和建模再也不會打架了
- 【原創】Ubuntu安裝和簡單使用初感Ubuntu
- 【原創】ORACLE 資料分析和動態取樣Oracle
- Java (原創) (轉)Java
- 原創文章檢測工具,檢測原創文章,過不了原創賬號的原因在這
- 8.掌握了Dart中的函式,你就掌握了原力!Dart函式
- Java JMS 極簡演示Java