一、前面我們一直發送的是字符串類型,其實activemq一共支持五種消息類型:
1.String消息類型:發送者:消費者:
1.String消息類型:發送者:消費者:
1.String消息類型:發送者:消費者:
1.String消息類型:發送者:消費者:
1.String消息類型:發送者:消費者:
二、3種監聽器:
1.MessageListener:
MessageListener是最原始的消息監聽器,它是JMS規范中定義的一個接口。其中定義了一個用於處理接收到的消息的onMessage方法,該方法只接收一個Message參數。我們前面在講配置消費者的時候用的消息監聽器就是MessageListener.
2.SessionAwareMessageListener:
SessionAwareMessageListener是Spring為我們提供的,它不是標准的JMS MessageListener。MessageListener的設計只是純粹用來接收消息的,假如我們在使用MessageListener處理接收到的消息時我們需要發送一個消息通知對方我們已經收到這個消息了,那么這個時候我們就需要在代碼里面去重新獲取一個Connection或Session。SessionAwareMessageListener的設計就是為了方便我們在接收到消息后發送一個回復的消息,它同樣為我們提供了一個處理接收到的消息的onMessage方法,但是這個方法可以同時接收兩個參數,一個是表示當前接收到的消息Message,另一個就是可以用來發送消息的Session對象,
3.MessageListenerAdapter:
MessageListenerAdapter類實現了MessageListener接口和SessionAwareMessageListener接口,它的主要作用是:1.將接收到的消息進行類型轉換,然后通過反射的形式把它交給一個普通的Java類進行處理。2.自定義反射類。3.自動回復發送者消息
重點說一下這個MessageListenerAdapter,
新建自定義監聽器java類:有兩個方法handleMessage和receiveMessage,其代碼如下(參數可以是五種消息類型,根據作用1可知這是自動根據反射轉換的,所以不需要像上面講的消息那樣在onmessage中轉換,你發送的文本就進入參數是String的,你發送的是實體類就進入到參數是實體類的)
package com.easylab.jms.consumer; import com.easylab.jms.entity.Student; public class myListenner { //方法里面的參數可以是那五種消息類型,在接受的時候會自動通過反射轉換,而不是想別的監聽器需要在onmessage房中手動轉換 public void handleMessage(Student message) { System.out.println("ConsumerListener通過handleMessage接收到一個純文本消息,消息內容是:" + message.toString()); } public void receiveMessage(Student message) { System.out.println("ConsumerListener通過receiveMessage接收到一個純文本消息,消息內容是:" + message.toString()); } public void handleMessage(String message) { System.out.println("ConsumerListener通過handleMessage接收到一個純文本消息,消息內容是:" + message.toString()); } //一旦defaultListenerMethod設置的方法,返回值不是null,就說明要把返回值自動回復給發送者 public String receiveMessage(String message) { System.out.println("ConsumerListener通過receiveMessage接收到一個純文本消息,消息內容是:" + message.toString()); return"自動給你回復消息了哦,你接到了嗎?"; } }
在xml配置文件中配置自己的監聽器和容器和隊列,監聽哪個隊列、用哪個方法接收、用哪個方法回復、回復到哪個隊列都可以設置
<!--以下是使用MessageListenerAdapter監聽器相關==============================================================================--> <!-- 消息監聽適配器 第一種方法通過構造方法參數設置 --> <!--<bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <constructor-arg> <bean class="com.easylab.jms.consumer.myListenner"/> </constructor-arg> </bean>--> <!-- 消息監聽適配器 第二種方法通過delegate屬性設置 --> <bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <property name="delegate"> <bean class="com.easylab.jms.consumer.myListenner"/> </property> <!--默認接受到消息后調用哪個方法--> <property name="defaultListenerMethod" value="receiveMessage"/> <!--設置監聽器回復消息的隊列(用的以前的點對點隊列),也可以通過發送者發送方中的方法setJMSReplyTo設置--> <property name="defaultResponseDestination" ref="queueDestination"/> </bean> <!-- 消息監聽適配器對應的監聽容器 --> <bean id="messageListenerAdapterContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory"/> <property name="destination" ref="adapterQueue"/> <property name="messageListener" ref="messageListenerAdapter"/><!-- 使用MessageListenerAdapter來作為消息監聽器 --> </bean> <!-- 用於測試消息監聽適配器的隊列目的地 --> <bean id="adapterQueue" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg> <value>adapterQueue</value> </constructor-arg> </bean>
發送者:
//以下是使用MessageListenerAdapter監聽器相關 @Resource(name = "adapterQueue") Destination destination; @Resource(name = "queueDestination") Destination responseQueue; @Override public void sendMessageByAdapter(String message){ // 使用JmsTemplate發送消息 jmsTemplate.send(destination, new MessageCreator() { public Message createMessage(Session session) throws JMSException { TextMessage textMessage = session.createTextMessage(message); System.out.println("發送消息:"); //通過setJMSReplyTo設置監聽器回復消息的隊列,也可以通過xml中配置defaultResponseDestination設置 /* textMessage.setJMSReplyTo(responseQueue);*/ return textMessage; } }); }
運行java類:
service.sendMessageByAdapter("測試MessageListenerAdapter");
運行結果:
結果可以看到接收到了消息,也自動回復了消息。