1. 程式人生 > >Java中介軟體JMS(四)之ActiveMQ整合spring之類轉換

Java中介軟體JMS(四)之ActiveMQ整合spring之類轉換

前幾章都是直接傳送MapMessage型別的資料,拿前面的例子來講,如果生產者傳送的是TextMessage,消費者也是必須TextMessage;如果我們自己要傳送的資料不是TextMessage型別,而消費者還是TextMessage的,那該怎麼辦?難道每次接受後都要增加一個轉換方法麼?其實spring早就考慮到這種情況了。轉化器在很多元件中都是必不缺少的東西Spring的MessageConverter介面提供了對訊息轉換的支援。

1、轉換類的相關程式碼POJO

新建一個類MsgPoJo,就是一個簡單的Pojo類。具體程式碼如下:

  1. package jms.mq.spring;  
  2. import
     java.io.Serializable;  
  3. publicclass MsgPoJo implements Serializable{  
  4.     private String id;  
  5.     private String text;  
  6.     public String getId() {  
  7.         return id;  
  8.     }  
  9.     publicvoid setId(String id) {  
  10.         this.id = id;  
  11.     }  
  12.     public String getText() {  
  13.         return text;  
  14.     }  
  15.     publicvoid setText(String text) {  
  16.         this.text = text;  
  17.     }     
  18. }  

2.轉換類的實現

新建一個類MsgConverter.java,實現MessageConverter介面。生成的程式碼如下

  1. package jms.mq.spring;  
  2. import javax.jms.JMSException;  
  3. import javax.jms.Message;  
  4. import javax.jms.Session;  
  5. import javax.jms.TextMessage;  
  6. import org.springframework.jms.support.converter.MessageConversionException;  
  7. import org.springframework.jms.support.converter.MessageConverter;  
  8. publicclass MsgConverter implements MessageConverter{  
  9.     @Override
  10.     public Object fromMessage(Message message) throws JMSException,  
  11.     MessageConversionException {  
  12.         if (!(message instanceof TextMessage)) {  
  13.             thrownew MessageConversionException("Message is not TextMessage");  
  14.         }  
  15.         System.out.println("--轉換接收的訊息--");  
  16.         TextMessage textMessage = (TextMessage) message;  
  17.         MsgPoJo msgPojo = new MsgPoJo();  
  18.         String[] texts=textMessage.getText().split(",");  
  19.         msgPojo.setId(texts[0]);  
  20.         msgPojo.setText(texts[1]);  
  21.         return msgPojo;  
  22.     }  
  23.     @Override
  24.     public Message toMessage(Object object, Session session) throws JMSException,  
  25.     MessageConversionException {  
  26.         if (!(object instanceof MsgPoJo)) {  
  27.             thrownew MessageConversionException("obj is not MsgPojo");  
  28.         }  
  29.         System.out.println("--轉換髮送的訊息--");  
  30.         MsgPoJo msgPojo = (MsgPoJo) object;  
  31.         TextMessage textMessage = session.createTextMessage();  
  32.         textMessage.setText(msgPojo.getId()+","+msgPojo.getText());  
  33.         return  textMessage;  
  34.     }  
  35. }  

程式碼很簡單就是做些轉換,有fromMessage和toMessage兩個方法,真好對應傳送轉換toMessage和接受轉換fromMessage。此時,傳送和接收訊息要換成template.convertAndSend(message);template.receiveAndConvert()。接下來我做一些配置,讓spring知道我們的轉換類。修改applicationContext.xml中jms模版配置的程式碼,修改後的程式碼如下:

  1. <!-- 類轉換 -->
  2. <beanid="msgConverter"class="jms.mq.spring.MsgConverter"></bean>
  3. <!-- 配置Jms模板 -->
  4. <beanid="jmsQueueTemplate"class="org.springframework.jms.core.JmsTemplate">
  5.     <propertyname="connectionFactory"ref="connectionFactory"/>
  6.     <propertyname="defaultDestination"ref="queueDest"/>
  7.     <!--<property name="receiveTimeout" value="10000" /> -->
  8.     <!-- 類轉換 -->
  9.     <propertyname="messageConverter"ref="msgConverter"></property>
  10. </bean>

注意:如果你有佇列監聽容器配置,配置jmsQueueTemplate和jmsTopicTemplate可能與佇列容器配置衝突。

3、業務相關程式碼和配置

在QueueProducerService.java增加convertAndSend()方法並在其實現類中實現,實現類的程式碼如下:

  1. package jms.mq.spring;  
  2. import java.util.Date;  
  3. import javax.jms.Destination;  
  4. import javax.jms.JMSException;  
  5. import javax.jms.Message;  
  6. import javax.jms.Session;  
  7. import javax.jms.TextMessage;  
  8. import org.springframework.jms.core.JmsTemplate;  
  9. import org.springframework.jms.core.MessageCreator;  
  10. publicclass QueueProducerService{  
  11.     JmsTemplate jmsTemplate;  
  12.     Destination destination;  
  13.     publicvoid send() {  
  14.         MessageCreator messageCreator = new MessageCreator() {  
  15.             public Message createMessage(Session session) throws JMSException {  
  16.                 TextMessage message = session.createTextMessage();  
  17.                 message.setText("QueueProducerService傳送訊息"+new Date());  
  18.                 return message;  
  19.             }  
  20.         };  
  21.         jmsTemplate.send(this.destination,messageCreator);  
  22.     }  
  23.     publicvoid convertAndSend(){  
  24.         MsgPoJo msgPojo = new MsgPoJo();  
  25.         msgPojo.setId("1");  
  26.         msgPojo.setText("first msg");  
  27.         System.out.println("--傳送訊息:msgPojo.id為"+msgPojo.getId()+";msgPojo.text為"+msgPojo.getText());  
  28.         jmsTemplate.convertAndSend(this.destination, msgPojo);  
  29.     }  
  30.     publicvoid setJmsTemplate(JmsTemplate jmsTemplate) {  
  31.         this.jmsTemplate = jmsTemplate;  
  32.     }  
  33.     publicvoid setDestination(Destination destination) {  
  34.         this.destination = destination;  
  35.     }  
  36. }  

同樣在QueueConsumerService.java中增加receiveAndConvert()方法並在其實現類中實現,實現類的程式碼如下:

  1. package jms.mq.spring;  
  2. import javax.jms.Destination;  
  3. import javax.jms.JMSException;  
  4. import javax.jms.TextMessage;  
  5. import org.springframework.jms.core.JmsTemplate;  
  6. publicclass QueueConsumerService{  
  7.     JmsTemplate jmsTemplate;  
  8.     Destination destination;  
  9.     publicvoid receive() {  
  10.         TextMessage message = (TextMessage) jmsTemplate.receive();  
  11.         try {  
  12.             System.out.println("QueueConsumerService收到訊息:"+message.getText());  
  13.         } catch (JMSException e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.     }  
  17.     publicvoid receiveAndConvert() {  
  18.         MsgPoJo msgPojo = (MsgPoJo)jmsTemplate.receiveAndConvert();  
  19.         if(msgPojo!=null){  
  20.             System.out.println("--收到訊息:msgPojo.id為"+msgPojo.getId()+";msgPojo.text為"+msgPojo.getText());  
  21.         }  
  22.     }  
  23.     publicvoid setJmsTemplate(JmsTemplate jmsTemplate) {  
  24.         this.jmsTemplate = jmsTemplate;  
  25.     }  
  26.     publicvoid setDestination(Destination destination) {  
  27.         this.destination = destination;  
  28.     }  
  29. }  

修改我們的兩個測試類,增加對轉換方法的呼叫,不再贅述,直接上程式碼:

QueueConsumerTest.java測試類

  1. package jms.mq.spring;  
  2. import org.springframework.context.ApplicationContext;  
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  4. publicclass QueueConsumerTest {  
  5.     privatestatic ApplicationContext appContext = new ClassPathXmlApplicationContext( "applicationContext.xml");  
  6.     

    相關推薦

    Java中介軟體JMS()ActiveMQ整合spring之類轉換(三)

    前幾章都是直接傳送MapMessage型別的資料,拿前面的例子來講,如果生產者傳送的是TextMessage,消費者也是必須TextMessage;如果我們自己要傳送的資料不是TextMessage型別,而消費者還是TextMessage的,那該怎麼辦?難道每次接受後都要增

    Java中介軟體JMS()ActiveMQ整合spring之類轉換

    前幾章都是直接傳送MapMessage型別的資料,拿前面的例子來講,如果生產者傳送的是TextMessage,消費者也是必須TextMessage;如果我們自己要傳送的資料不是TextMessage型別,而消費者還是TextMessage的,那該怎麼辦?難道每次接受後都要增加一個轉換方法麼?其實sprin

    Java中介軟體JMS(三)ActiveMQ整合spring監聽器(二)

    對於讓spring管理監聽的實現方式有兩種方法,一種是自己寫監聽器,然後交給spring的監聽介面卡管理,再由監聽容器管理監聽介面卡,另一種是寫一個實現MessageListener介面的類。第一種在第一章涉及到,但是沒有交給spring託管.其實實現的方法很簡單,在j2e

    Java中介軟體JMS(五)JMS入門

      3).JBoss 是 JBoss 公司開發的一個免費開源的應用伺服器,它提供了 EJB 執行的環境,並能夠結合 EJB 進行 JMS 訊息的收取,支援點到點模型和釋出/訂閱模型。  4).ActiveMQ 是一個基於 Apache 2.0 Licenced 釋出的開放原始碼的 JMS 產品,它能夠提供點到

    Java中介軟體JMSActiveMQ入門

    1.ActiveMQ概述 企業訊息軟體從80年代起就存在,它不只是一種應用間訊息傳遞風格,也是一種整合風格。因此,訊息傳遞可以滿足應用間的通知和互相操作。但是開源的解決方案是到最近10年才出現的。Apache ActiveMQ就是其中一種。它使應用間能以非同步,鬆耦合方式交流。ActiveMQ 是Apa

    () 訊息中介軟體——使用 JmsTemplate 向 ActiveMQ 傳送 Queue 型別訊息

    文章目錄 前言 傳送類的編寫 建立 類 JmsTemplateQueueProduct 方法一 send 方法二 convertAndS

    activemq訊息中介軟體--JMS概述(1)

    1 JMS概述 目前現在很多的RPC中介軟體技術都有如下問題: (1)同步通訊,客戶端發出呼叫請求,必須等待服務端處理完成以後返回結果才能繼續執行。 (2)客戶和服務物件的生命週期緊密耦合,客戶程序和服務程序都必須正常進行,如果由於服務物件的崩潰和網路故障導致客戶請求不可達,客戶收到

    jmsactiveMQspring整合進階-實現一種負載均衡

    ="http://www.springframework.org/schema/beans            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd            http://www.springframe

    (六) 訊息中介軟體——使用 JmsTemplate 向 ActiveMQ 傳送和獲取 Topic 型別訊息

    文章目錄 前言 回顧 Queue 型別訊息的傳送和請求過程 ActiveMQTopic 和 JmsTemplate Topic 型別訊息的特性

    (五) 訊息中介軟體——使用 JmsTemplate 向 ActiveMQ 獲取 Queue 型別訊息

    文章目錄 前言 為什麼不將傳送和接收寫到同一篇文章中? 傳送和接收的聯絡和區別-本質上是對某一個 ActiveMQQueue 的操作 讀取 Queue 中的訊息

    《大型網站系統與JAVA中介軟體實踐》 第六章 訊息中介軟體

        如何保證一致性                     &

    《大型網站系統與JAVA中介軟體實踐》 第五章 資料訪問層

             兩階段提交                 &nbs

    《大型網站系統與JAVA中介軟體實踐》 第一章

     主要內容  1、將單機發展為分散式 分散式也可以看為大型單機 控制儲存和計算單元變得更大了 2、 NIO BIO AIO 3、 互動呼叫常見方式: 名稱 、規則 、master、 4、分散式的難點     1)、單點故障 &nb

    訊息中介軟體JMS

    一.什麼是訊息中介軟體      訊息中介軟體利用高效可靠的訊息傳遞機制進行平臺無關的資料交流,並基於資料通訊來進行分散式系統的整合。通過提供訊息傳遞和訊息排隊模型,它可以在分散式環境下擴充套件程序間的通訊。   ActiveMQ 是Apache出品,最流行的,能力強勁的開源訊息匯流排。Acti

    訊息中介軟體學習1:ActiveMQ

    TODO 歡迎使用Markdown編輯器 你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。 新的改變 我們對Markdown編輯器進行了一些功能拓展與

    訊息中介軟體入門「二」:在spring中使用activemq

    訊息中介軟體入門「二」:在spring中使用activemq 在普通的java專案使用activemq一般需要經過:1.獲得連線工廠;2.建立連線;2.啟動連線;3.獲取會話(session);4.繫結連線地址(detination)5.獲得消費者/生產者;6.生產/消費訊息。