2014-02-27 43 views
1

我的應用程序是基於Spring的應用程序。我使用activemq作爲經紀人。我在應用程序中管理兩個不同的隊列接收消息。同步彈簧ActiveMQ接收器

對於每個隊列,我的應用程序的目標是偵聽在代理上發送的消息,然後繼續消息(讀取消息,執行數據庫操作,接收來自此消息的信息等),然後處理下一條消息治療是同步的,我想按照他們到達的順序進行消息)。

我的實際設計中,這是一個:

我創建一個線程

<bean id="pollThread" class="my.app.receiver" init-method="start" destroy-method="interrupt"> 
</bean> 

的run()在一段時間(true)循環線程調用,它確實的方法的方法:

  • 此線程創建一個連接到活動mq和塊與接收
  • 收到後,我關閉連接並處理消息(數據庫的東西等)
  • 處理完成,方法

的結束,然後重新開始治療(有聽得到,處理等)

我的問題是:是否有任何的方式來設計更好?我唯一的強制過程是按照到達順序繼續發送消息,並在處理下一條消息之前進行處理。

我讀過很多關於JMSTemplate等等的東西,但是我迷失了所有的信息。

其實我最好的猜測是太創建PooledConnectionFactory(因爲我們只需要使用的ActiveMQ和CachingConnectionFactory似乎已經在我們的架構中重要的限制),並把它限制在一個concurrentConsumer。然後使用MessageListener接口繼續我的消息。

感謝

回答

-1

您可以使用Spring框架提供的消息驅動POJO的基礎設施。它會在目的地進行輪詢,並在經紀人失敗時恢復等。

您可以更改您的代碼(如YourMessageListener)以實施MessageListener。那麼下面的配置可以讓你開始

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="messageListener" class="org.foo.YourMessageListener"/> 

    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
     <property name="brokerURL" value="tcp://your-server:61616"/> 
    </bean> 

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

    <bean id="jmsContainer" 
      class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
     <property name="connectionFactory" ref="connectionFactory"/> 
     <property name="destination" ref="destination"/> 
     <property name="concurrency" value="1"/> 
     <property name="messageListener" ref="messageListener"/> 
    </bean> 
</beans> 

重要的設置是concurrency元素這限制了是可以同時處理在該目的地的消息的線程數。通過將其設置爲1,一次只有一個線程會消耗一條消息。

查看documentation瞭解更多詳情

+0

對不起,我的延遲響應。你的回答與我在帖子和你回答的時間之間實現的結果類似。我最終使用了PooledConnectionFactory和jms命名空間:[spring-jms-3.0](http://www.springframework.org/schema/jms/spring-jms-3.0.xsd) 併發性參數是maxConcurrentConsumers也設爲1。 – Steph0