訊息中介軟體規範JMS 2.0的十大改進
作者:chszs,轉載需註明。部落客頁:http://blog.csdn.net/chszs
訊息中介軟體規範JMS 2.0在編碼方面做了很多改進,可以協助開發人員減少編寫的代碼量。下面,由我一一說明。
一、用JMSContext取代了Connection和Session對象
訊息中介軟體規範JMS 2.0引入了一個新對象——JMSContext,它提供了原先Connection和Session對象同樣的功能。
在JMS 1.1中是這樣的:
Connection connection = ConnectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
在JMS 2.0中是這樣的:
JMSContext context = connectionFactory.createContext(JMSContext.SESSIONA_TRANSACTED);
二、利用try-with-resources塊意味著無需調用close語句
在JMS 1.1中如果不調用close語句,那麼或許會導致記憶體資源耗盡。
在JMS 1.1中是這樣的:
try{
Connection connection = connectionFactory.createConnection();
try{
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
} finally{
connection.close();
}
} catch(JMSException ex){
ex.printStackTrace();
}
在JMS 2.0中是這樣的:
try (Connection connection = connectionFactory.createConnection();) {
......
} catch(JMSException ex){
ex.printStackTrace();
}
注意,上面的代碼也可改用JMSContext。
三、在JavaSE中建立會話時無需傳遞兩個參數
在JMS 1.1中是這樣的:
Session session = connection.createSession(true,Session.SESSION_TRANSACTED);
在JMS 2.0中是這樣的:
Session session = connection.createSession(Session.SESSION_TRANSACTED);
四、在JavaEE交易處理中建立會話無需傳遞任何參數
在JavaEE交易處理中建立會話,createSession傳遞的參數會被忽略掉,詳見EJB 3.1規範。
在JMS 1.1中是這樣的:
// 傳遞的兩個參數都會被忽略事務的行為由容器決定
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
在JMS 2.0中是這樣的:
// JMS 2中提供了無參方法
Session session = connection.createSession();
五、新的JMSProducer對象支援方法鏈
訊息中介軟體規範JMS 2.0引入了一個新對象——JMSProducer,他允許訊息頭、訊息屬性、交付的選項等都在單行代碼中通過方法鏈進行指定。
在JMS 1.1中是這樣的:
MessageProducer messageProducer = session.createProducer(domoQueue);
messageProducer.setPriority(1);
TextMessage textMessage = session.createTextMessage(body);
textMessage.setStringProperty("foo", "bar");
messageProducer.send(textMessage);
在JMS 2.0中是這樣的:
TextMessage textMessage = context.createTextMessage(body);
context.createProducer().setPriority(1).setProperty("foo", "bar").send(demoQueue, textMessage);
六、無需儲存JMSProducer的變數
新的JMSPruducer對象是輕量級對象,因此無需在變數中儲存它,當需要時直接執行個體化即可。
在JMS 1.1中是這樣的:
// MessageProducer開銷很大,因此需要重用它
MessageProducer messageProducer = session.createProducer(demoQueue);
messageProducer.send(message1);
messageProducer.send(message2);
在JMS 2.0中是這樣的:
// JMSProducer是輕量級的,無需用變數儲存它
context.createProducer().send(demoQueue, message1);
context.createProducer().send(demoQueue, message2);
七、在JavaEE中,注入JMSContext意味著無需建立或關閉它
在JMS 1.1中是這樣的:
try{
Connection connection = connectionFactory.createConnection();
try{
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(demoQueue);
TextMessage textMessage = session.createTextMessage(body);
messageProducer.send(textMessage);
} finally{
connection.close();
}
} catch(JMSException ex){
ex.printStackTrace();
}
在JMS 2.0中是這樣的:
try{
context.createProducer().send(inboundQueue, body);
} catch(JMSRuntimeException ex){
ex.printStackTrace();
}
八、當發送訊息時,無需執行個體化訊息對象
在JMS 1.1中是這樣的:
// 需要建立適合類型的訊息對象,再設定其Body
MessageProducer messageProducer = session.createProducer(demoQueue);
TextMessage textMessage = session.createTextMessage("Hello World");
messageProducer.send(textMessage);
在JMS 2.0中是這樣的:
// 簡單的傳遞訊息Body到send方法
context.createProducer().send(demoQueue, "Hello World");
九、同步接收,可以直接接收訊息有效載荷
在JMS 1.1中是這樣的:
// 當同步接收時,需給定訊息對象,再轉換為合適的子類型,再提取Body
MessageConsumer messageConsumer = session.createConsumer(demoQueue);
TextMessage textMessage = (TextMessage)messageConsumer.receive(1000);
if(textMessage==null)
return "Received null"
else
return "Received " + textMessage.getText();
在JMS 2.0中是這樣的:
// JMS 2允許直接接收訊息Body
JMSConsumer consumer = context.createConsumer(demoQueue);
return "Received " + consumer.receiveBody(String.class, 1000);
十、非同步接收在提取訊息Body時無需轉換
在JMS 1.1中是這樣的:
public void onMessage(Message m){
MyObject myObj = (MyObject)((ObjectMessage)m).getObject();
...
在JMS 2.0中是這樣的:
public void onMessage(Message m){
MyObject myObj = m.getBody(MyObject.class);
...