2012-01-28 15 views
3

Springでコンシューマー・リスナーのxmlベースの構成の簡単なサンプルを誰かが共有しているという条件に満足しています。前もって感謝します。Activemqコンシューマー・リスナーを構成する方法(Java)

EDIT;

私はすでに私のアプリでactive-mqを実装しているので、コンシューマの実装ではなく、消費者のリスナーについて聞きたいと思います。それはうまく動作していますが、プロデューサによって同期的に送信されるアイテムの消費順序を確認することはできません。 問題は、一度に同時コンシューマからメソッドを非同期で実行することによって(そのオブジェクトをログに記録するために一部のオブジェクトをdbに永続させるため)、不整合とデータ操作です。

EDIT2: この複雑さを明確にしてください。私は2つの基本部分からなるアプリケーションを持っています。最初は、同期して実行するプロデューサで、新しく来る製品をdbに問い合わせ、次に、active-mqが提供する "jmsTemplate.send"メソッドを使って "1つずつ"送る。これは、Cron/Timerから同期して実行される操作でした。言い換えれば、プロデューサはタイマー/クーロンから実行されています。今問題は消費者自身です。プロデューサが製品を「1つずつ」送信すると、非同期コンシューマ(同時実行可能)が製品を受信して​​非同期に消費されます。

問題はここから始まります。製品がちょうど受け取られたときに消費者から実行されるメソッドは、いくつかのdb永続化操作を実行するためです。同じ製品が別のコンカレントコンシューマによって受信されている場合(これは、Jmsの問題ではなく、私たちのシステムのために起こります)、同じエンティティで同じパーシスタンス操作を行うことは、予測が容易な例外がいくつか発生します。どのようにしてこの種のアプリケーションでこの製品の非同期操作を防止したり、製品の注文を管理したりすることができますか。

ありがとうございました。

+0

この部分 - >しかし、プロデューサによって同期的に送信されるアイテムを消費する順序を確認することはできません。問題は、一度にコンシューマのコンシューマからメソッドを非同期で実行すること(それらをログに記録するためにいくつかのオブジェクトをdbに永続化させること)に起因する矛盾とデータ操作です。あなたのシステムで、どこに問題がありますか? – Eugene

+0

もう一度私の編集した質問を確認してください。ありがとうございます.. – Javatar

答えて

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リスナーを自動的に起動します一度それをする。

EDIT他の質問に従って:

だからあなたのシステムが同じのproductIDを消費者に配信(例えば)2つのまたはそれ以上のメッセージを生成することがあり?まずはこれはあなたの問題ではなく、アプリケーションの問題です。たとえあなたが何らかの形でそれを修正したとしても、それは実際の修正ではありませんが、問題自体を隠す方法です。それにもかかわらず、ソリューションを提供するように強制されれば、今のところ、最も簡単なのは1つだと考えることができます。私がやることは次のとおりです。キュー内のメッセージを受信し、そのキュー上に1つのコンシューマしか持たない。このコンシューマーの内部では、私ができる限りメッセージから少ししか処理しませんでした。プロダクトIDのみをとり、他のキューに配置します。これの前に、productIDがまだそのキューにないかどうかを常にチェックする必要があります。それが黙って返ってきた場合は、それが処理されていないことを意味します。したがって、このメッセージを別のQueue:Queue2に配置してから、2番目のQueue Queue2でコンカレントコンシューマを有効にします。これにはまだ欠陥があります。まず、productIDキューを何らかの方法でしばらく掃除しなければなりません。さもなければ、それは永遠に成長しますが、それは難しいことです。トリッキーな部分:productIDキューにproductIDがあり、その製品がINSERTではなくDBにUPDATEされていたらどうでしょうか?あなたはそれを拒否すべきではありません...私はあなたの考えを知って、あなたの質問/誤解を教えてください。

乾杯、

ユージン。

+0

あなたの返答をありがとう、しかし、私はそれの消費者の実装ではなく、消費者自身のリスナーを知りたいと思います。 – Javatar

+0

@Bariscan更新された回答も参照してください – Eugene

+0

"プロダクトIDのみを取り出して他のキューに入れてください。これ以前には、プロダクトIDがそのキューにないかどうかを常に確認する必要があります。それでおしまい!あなたは何の忍耐を持っていますか?あなたは読んで、思考し、共有しています、あなたは良い人です、あなたは男です!どうもありがとう! – Javatar

関連する問題