2012-01-28 222 views
3

如果有人在Spring中共享一個簡單的基於xml的消費者監聽器配置示例,我會很高興。提前致謝。Activemq如何配置一個消費者監聽器(用Java編寫)

編輯;

我只想聽聽消費者的聽衆,而不是消費者的實現,因爲我已經在我的應用中實現了一個active-mq。並且它運行良好,但是我不能確定消費者同步發送的物品的順序。 問題是由於一次一個方法的異步執行(同時持有某些對象到db以記錄它們)而導致的不一致和數據操作。

編輯2: 讓我澄清這個複雜性。我有一個包含兩個基本單獨部分的應用程序。第一個是同步執行的Producer,爲新產品詢問db,然後「逐個」通過active-mq提供的「jmsTemplate.send」方法發送它們。這是從Cron/Timer同步執行的操作。換句話說,生產者正在從計時器/計時器執行。現在的問題是消費者本身。當生產者「一個接一個」地發送產品時,異步消費者(啓用併發)接收產品並異步使用它們。

問題從這裏開始。因爲當產品剛收到時從消費者執行的方法會執行一些數據庫持久性操作。當同一個產品被不同的併發消費者接收時(它是因爲我們的系統而發生的,而不是jms的問題,不關注這一點),那麼在同一個實體上執行相同的持久化操作會發生一些容易預測的異常。如何防止產品的異步操作或管理這類應用程序中令人厭惡的產品的訂單。

謝謝。

+0

這部分 - >但是我不能確定消費者同步發送的物品的順序。問題是由於一次一個方法異步執行一個方法(持久化一些對象到db以記錄它們)而導致的不一致和數據操作。< - 真的很複雜,可能會詳細說明發生了什麼在你的系統中,問題在哪裏? – Eugene 2012-01-31 17:27:29

+0

請再次檢查我編輯的問題上面..非常感謝.. – Javatar 2012-02-02 15:50:14

回答

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

<!-- A simple and usual connection to activeMQ --> 
<bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
    <property name="brokerURL" value="tcp://localhost:61616"></property> 
</bean>     

<!-- A POJO that implements the JMS message listener --> 
<bean id="simpleMessageListener" class="MyJMSMessageListener" /> 


<!-- Cached Connection Factory to wrap the ActiveMQ connetion --> 
<bean id="cachedConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">  
    <property name="targetConnectionFactory" ref="activeMQConnectionFactory"></property> 
    <property name="sessionCacheSize" value="10"></property> 
    <property name="reconnectOnException" value="true"></property> 
</bean> 


<!-- The Spring message listener container configuration --> 
<jms:listener-container container-type="default" connection-factory="cachedConnectionFactory" acknowledge="auto"> 
    <jms:listener destination="FOO.TEST" ref="simpleMessageListener" method="onMessage" /> 
</jms:listener-container> 

</beans> 

並偵聽消息itslef的Java類:

import javax.jms.Message; 
import javax.jms.MessageListener; 
public class MyJMSMessageListener implements MessageListener{ 

    @Override 
    public void onMessage(Message message) { 
    // Do your work here 
    } 

}

啓動這個監聽器是讓應用程序上下文的問題,它會自動啓動JMS偵聽一旦你這樣做。

所以您的系統可能產生(例如)交付給消費者以相同的2級的productID甚至更多的消息:

根據其他問題編輯?首先,這不是你的問題,而是應用程序的問題。即使你以某種方式修復它,它也不是一個修復,但它是一種隱藏問題的方法。儘管如此,如果現在被迫提供解決方案,我只能想到最簡單的一種解決方案,即禁用併發消費類型。這是我會做的:接收隊列中的消息,並且只有一個消費者在該隊列中。在消費者內部,我會盡可能少地處理消息 - 只取得productID並將其放在其他隊列中。在此之前,您必須始終檢查productID是否不在該隊列中。如果它只是靜默地返回,如果不是,那意味着它從未被處理,因此將該消息放置在不同的Queue:Queue2中,然後在第二個隊列Queue2上啓用併發消費者。儘管如此,這仍然存在一些缺陷:首先,應該稍後清理一下productID隊列,否則它會一直增長,但這就是那麼難。棘手的部分:如果productID隊列中有productID,但是產品是用於DB中的UPDATE而不是INSERT的呢?你不應該拒絕它......讓我知道你的想法,並告訴我你的問題/誤解。

乾杯,

尤金。

+0

感謝您的答覆,但我想知道不是消費者實施它,而是消費者本身的實際聽衆。 – Javatar 2012-01-31 13:55:47

+0

@Bariscan查看更新後的答案也 – Eugene 2012-02-03 07:01:41

+0

「只採取productID並將其放在其他隊列中。在此之前,您必須始終檢查productID是否不在該隊列中。」而已!你有多耐心!你閱讀,思考和分享,你是一個好人,你是人!非常感謝! – Javatar 2012-02-03 08:07:39

相關問題