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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JMS--ActiveMq与spring整合(二)

發(fā)布時間:2024/4/14 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JMS--ActiveMq与spring整合(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文地址:http://blog.csdn.net/haoxingfeng/article/details/9167895  

在我們和Spring 整合的時候,對于消費者而言我們有三種不同類型的監(jiān)聽器可以去選擇,他們分別是MessageListener,SessionAwareMessageListener,MessageListenerAdapter,下面我們就來說說他們之間的區(qū)別。

1、MessageListener

  MessageListener是最原始的消息監(jiān)聽器,是JMS規(guī)范中定義的接口。其中定義了用于處理消息的onMessage(Message message) 接口,改方法只接受一個Message類型的參數(shù),在JMS--ActiveMq與spring整合(一)種我們使用的就是MessageListener。

2、SessionAwareMessageListener

  SessionAwareMessageListener 并不是原始的消息監(jiān)聽器。它是Spring為我們提供的,它不是標(biāo)準(zhǔn)的JMS MessageListener。原始的MessageListener只是純粹的用來接收消息,假如我們在使用MessageListener處理接收到的消息時我們需要發(fā)送一個消息通知對方我們已經(jīng)收到這個消息了,那么這個時候我們就需要在代碼里面去重新獲取一個Connection或Session。SessionAwareMessageListener的設(shè)計就是為了方便我們在接收到消息后發(fā)送一個回復(fù)的消息,它同樣為我們提供了一個處理接收到的消息的onMessage方法,但是這個方法可以同時接收兩個參數(shù),一個是表示當(dāng)前接收到的消息Message,另一個就是可以用來發(fā)送消息的Session對象。

  xml配置:

<bean id="sessionAwareQueue" class="org.apache.activemq.command.ActiveMQQueue">
  <constructor-arg>
    <value>sessionAwareQueue</value>
  </constructor-arg>
</bean>

<bean id="sessionAwareConsumerMessageListener" class="com.ghq.activemq.SessionAwareConsumer">
  <property name="destination" ref="queue"></property>
</bean>

<bean id="sessionAwareMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  <property name="destination" ref="sessionAwareQueue"></property>
  <property name="messageListener" ref="sessionAwareConsumerMessageListener"></property>
  <property name="connectionFactory" ref="connectionFactory"></property>
</bean>

  Java代碼:

public class SessionAwareConsumer implements SessionAwareMessageListener<Message> {

  private Destination destination;

  public void onMessage(Message message, Session session) throws JMSException {
    TextMessage tMessage = (TextMessage) message;
    System.out.println("SessionAwareConsumer接收消息:"+tMessage.getText());
    MessageProducer producer = session.createProducer(destination);
    producer.send(session.createTextMessage(tMessage.getText()));
  }

  public Destination getDestination() {
    return destination;
  }

  public void setDestination(Destination destination) {
    this.destination = destination;
  }

}

  producer發(fā)送了一個消息到sessionAwareQueue ,sessionAwareMessageListenerContainer接收消息將消息傳遞給真正的處理這SessionAwareConsumer,SessionAwareConsumer出來了消息并向queue 輸出了改消息,并向queue發(fā)送了改消息。messageListenerContainer 處理了改消息。

3、MessageListenerAdapter

  MessageListenerAdapter實現(xiàn)了SessionAwareMessageListener和MessageListener接口。它的主要作用是將接收到的消息進行類型轉(zhuǎn)換

然后通過反射的形式把它交給一個普通的Java類進行處理。

?????? MessageListenerAdapter會把接收到的消息做如下轉(zhuǎn)換:

?????? TextMessage轉(zhuǎn)換為String對象;

?????? BytesMessage轉(zhuǎn)換為byte數(shù)組;

?????? MapMessage轉(zhuǎn)換為Map對象;

?????? ObjectMessage轉(zhuǎn)換為對應(yīng)的Serializable對象。

  ?既然前面說了MessageListenerAdapter會把接收到的消息做一個類型轉(zhuǎn)換,然后利用反射把它交給真正的目標(biāo)處理器——一個普通的Java類進行處理(如果真正的目標(biāo)處理器是一個MessageListener或者是一個SessionAwareMessageListener,那么Spring將直接使用接收到的Message對象作為參數(shù)調(diào)用它們的onMessage方法,而不會再利用反射去進行調(diào)用),那么我們在定義一個MessageListenerAdapter的時候就需要為它指定這樣一個目標(biāo)類。這個目標(biāo)類我們可以通過MessageListenerAdapter的構(gòu)造方法參數(shù)指定,如:

?<bean?id="messageListenerAdapter"?class="org.springframework.jms.listener.adapter.MessageListenerAdapter">?

?  <constructor-arg><bean?class="com.ghq.activemq.Consumer"/></constructor-arg>

</bean>

?也可以通過它的delegate屬性來指定,如:

  xml:

<bean id="adapterQueue" class="org.apache.activemq.command.ActiveMQQueue">
  <constructor-arg>
    <value>adapterQueue</value>
  </constructor-arg>
</bean>

<bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
  <property name="delegate">
    <bean class="com.ghq.activemq.AdapterRealClass"></bean>
  </property>
  <!-- 默認(rèn)調(diào)用 com.ghq.activemq.AdapterRealClass 類的handleMessage方法,也可以通過defaultListenerMethod 屬性來設(shè)置方法名字-->
  <!-- <property name="defaultListenerMethod" value="myhandleMessage"></property> -->
</bean>


<bean id="adapterMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  <property name="destination" ref="adapterQueue"></property>
  <property name="messageListener" ref="messageListenerAdapter"></property>
  <property name="connectionFactory" ref="connectionFactory"></property>
</bean> 

  MessageListenerAdapter除了會自動的把一個普通Java類當(dāng)做MessageListener來處理接收到的消息之外,其另外一個主要的功能是可以自動的發(fā)送返回消息

???? 當(dāng)我們用于處理接收到的消息的方法的返回值不為空的時候,Spring會自動將它封裝為一個JMS Message,然后自動進行回復(fù)。那么這個時候這個回復(fù)消息將發(fā)送到哪里呢?這主要有兩種方式可以指定。
???????第一,可以通過發(fā)送的Message的setJMSReplyTo方法指定該消息對應(yīng)的回復(fù)消息的目的地。這里我們把我們的生產(chǎn)者發(fā)送消息的代碼做一下修改,在發(fā)送消息之前先指定該消息對應(yīng)的回復(fù)目的地為一個叫responseQueue的隊列目的地,具體代碼如下所示:

  在發(fā)送這代碼中加入下面一行話:

TextMessage tMessage = session.createTextMessage(message);
tMessage.setJMSReplyTo(responseQueue);

xml配置(去掉上面調(diào)用默認(rèn)方法handleMessage的注釋,調(diào)用我們自己的myhandleMessage):

<bean id="responseQueue" class="org.apache.activemq.command.ActiveMQQueue">
  <constructor-arg>
    <value>responseQueue</value>
  </constructor-arg>
</bean>
<bean id="responseQueueListener" class="com.ghq.activemq.ResponseQueueListener" />

<bean id="adapterMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  <property name="destination" ref="responseQueue"></property>
  <property name="messageListener" ref="responseQueueListener"></property>
  <property name="connectionFactory" ref="connectionFactory"></property>
</bean>

簡單java類:

public class AdapterRealClass {

  public void handleMessage(String message){
    System.out.println("AdapterRealClass handleMessage():"+message);
  }

  public String myhandleMessage(String message){
    System.out.println("AdapterRealClass myhandleMessage():"+message);
    return "myhandleMessage"+message;
  }
}

?第二,通過MessageListenerAdapter的defaultResponseDestination屬性來指定。這里我們也來做一個測試,首先維持生產(chǎn)者發(fā)送消息的代碼不變,即發(fā)送消息前不通過Message的setJMSReplyTo方法指定消息的回復(fù)目的地。

既然我們可以通過兩種方式來指定MessageListenerAdapter自動發(fā)送回復(fù)消息的目的地,那么當(dāng)我們兩種方式都指定了而且它們的目的地還不一樣的時候會怎么發(fā)送呢?當(dāng)兩種方式都指定了消息的回復(fù)目的地的時候使用發(fā)送消息的setJMSReplyTo方法指定的目的地將具有較高的優(yōu)先級,MessageListenerAdapter將只往該方法指定的消息回復(fù)目的地發(fā)送回復(fù)消息。

轉(zhuǎn)載于:https://www.cnblogs.com/gaohuiqian/p/5220235.html

總結(jié)

以上是生活随笔為你收集整理的JMS--ActiveMq与spring整合(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。