日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java EE 7:带有Glassfish v4的JMS 2.0

發布時間:2023/12/3 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java EE 7:带有Glassfish v4的JMS 2.0 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Java EE 7最近已被執行委員會接受 。 這意味著我們很快將在市場上提供Java EE 7應用服務器。 構成Java EE 7的規范之一是JMS 2.0 。 自1.1版以來,引入了一些有趣的改進。

JMS有很多怪異的東西,例如: Connection#createSession(boolean Transacted,int acceptMode)方法。

第一個方法參數( transacted )定義是否應處理會話。 Java EE應用程序具有負責事務處理的JTA。 我們可以選擇是否支持交易(默認)。 那么,為什么我們需要這個論點呢?
第二個方法參數( acknowledgeMode )是一個從Session對象獲取的整數常量 。 認真地說,整數常量使該API看起來太過傳統。 最后,Java EE環境中這些參數的含義是什么? JavaDoc的說, acknowledgeMode如果會話事務被忽略。

這是什么意思? 不外乎: 這些參數對于Java EE上下文中使用的JMS生產者沒有任何意義 。 這就是為什么他們鼓勵您使用(true, 0)參數值以避免不必要的混淆的原因。 這聞起來有遺味。

好的,讓我們回到主要主題。 我想看一下JMS世界中的新功能,以及它如何使我能夠更輕松,更可維護的方式進行編碼。 我已經準備了一個使用JMS 2.0,JAX-RS和EJB(SLSB和MDB)的簡單Web應用程序,并將其推送到這里的 github存儲庫中。

先決條件和基礎架構

為了能夠運行此代碼,您應該創建一個示例隊列。 我已經在jms/queue/myqueue JNDI名稱下配置了它。

我正在使用Glassfish v4 build 87 。 要使用Java EE 7 API,我需要添加以下Maven依賴項:

<dependency><groupId>javax</groupId><artifactId>javaee-api</artifactId><version>7.0-b87</version><scope>provided</scope> </dependency>

駐留在此存儲庫中:

<repository><id>Java EE 7</id><url>https://maven.java.net/content/groups/promoted/</url> </repository>

這就是配置的全部內容。

有效負載和REST配置

BusinessObject是一個簡單的對象,將充當我們的JMS消息的有效負載。 它將由生產者發送并由消費者接收。 這里沒什么好想的,所以讓我們繼續前進。 RESTConfiguration甚至更簡單–它只是為我們的應用程序定義了JAX-RS端點前綴。 該前綴是:“ / rest”。 您可以通過訪問應用程序URL / rest / producer / jms11或/ rest / producer / jms20(例如http://localhost:8080/jms2_0_spike/rest/producer/jms20 )來調用生產者EJB。

JMS生產者

現在,這里開始變得有趣。 在下面,您可以找到SLSB JMS消息產生器的JMS 1.1代碼:

@Stateless public class JMS11Producer {@Resource(lookup = "jms/__defaultConnectionFactory")private ConnectionFactory connectionFactory;@Resource(lookup = "jms/queue/myqueue")private Queue queue;@Path("/jms11")@GETpublic String produce() {String status = "OK";Connection connection = null;try {connection = connectionFactory.createConnection();Session session = connection.createSession(true, 0);MessageProducer producer = session.createProducer(queue);BusinessObject payload = new BusinessObject(UUID.randomUUID().toString());ObjectMessage message = session.createObjectMessage();message.setObject(payload);producer.send(message);} catch (JMSException e) {status = e.getMessage();} finally {if (connection != null) {try {connection.close();} catch (JMSException e) {status = e.getMessage();}}}return status;} }

盡管JAX-RS結果狀態出現問題,但這是一個令人費解的樣板代碼,模糊了方法的主要職責。 它應該只向隊列發送一條消息,但是它卻做了很多事情。 它會創建一個連接,會話(包括討厭的,忽略的參數在內),對象類型的消息,將其初始化,然后最終將消息發送到隊列中……哦,是的–當然,不要忘記檢查異常和嵌套的try / catch塊。 我們可以嘗試去優化它-通過創建連接移動到一些如@PostConstruct方法和關閉,以@PreDestroy -但它仍然有很多unnecesary噪音。

現在,讓我們看一下功能上與JMS 2.0中表達的代碼相同的代碼:

@Stateless public class JMS20Producer {@Resource(lookup = "jms/queue/myqueue")private Queue queue;@Injectprivate JMSContext jmsContext;@Path("/jms20")@GETpublic String produce() {BusinessObject payload = new BusinessObject(UUID.randomUUID().toString());jmsContext.createProducer().send(queue, payload);return "OK";} }

很整潔吧? 弄清楚此方法的作用要容易得多:它創建有效負載并將其發送到隊列。 就這樣–這就是方法的全部內容。 異常處理,連接和會話創建,消息類型–一切都為我們完成。 如果可以將這些職責轉移到容器上以減輕開發人員的生活負擔,那么為什么不這樣做呢?

讓我們看一下此示例中使用的一些JMS 2.0功能:

  • 不需要ConnectionFactory ,
  • 無需Connection或Session ,
  • JMSContext是結合了Connection和Session功能的新對象。 它可以通過容器注入,
  • 沒有檢查的異常–僅JMSRuntimeException ,
  • 用于消息生成的鏈調用使其更易于閱讀。

JMS消費者

自JMS 1.1以來,Message Consumer并未發生太大變化。 它仍然是MDB,但是現在由于使用message.getBody(Clazz)進行消息投射,更容易達到預期的有效負載:

@MessageDriven(mappedName = "jms/queue/myqueue") public class Consumer implements MessageListener {@Overridepublic void onMessage(Message message) {try {// In JMS 1.1:// ObjectMessage objectMessage = (ObjectMessage)message;// BusinessObject payload = (BusinessObject)objectMessage.getObject();BusinessObject payload = message.getBody(BusinessObject.class);System.out.println("Message received: " + payload);} catch (JMSException e) {System.err.println("Error while fetching message payload: " + e.getMessage());}} }

結論

這只是對JMS 2.0的快速瀏覽。 但是,我發現有趣的是,與JMS 1.1相比,可以產生多少更清晰的代碼。 有關JMS 2.0的更多詳細信息,請查看其正式規范 。

參考:來自Piotr Nowicki博客博客的JCG合作伙伴 Piotr Nowicki的Java EE 7:帶有Glassfish v4的JMS 2.0 。

翻譯自: https://www.javacodegeeks.com/2013/05/java-ee-7-jms-2-0-with-glassfish-v4.html

總結

以上是生活随笔為你收集整理的Java EE 7:带有Glassfish v4的JMS 2.0的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。