訊息中介軟體規範JMS 2.0的十大改進

來源:互聯網
上載者:User
訊息中介軟體規範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);

...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.