2

私はCamelを初めて使用し、特定のシナリオでラクダを使用する方法を理解するのに苦労しています。このシナリオでは、時々アクションを生成する(Javaベースの)エージェントがあります。これらのイベントの通知を受け取るには、イベント駆動型のコンシューマーが必要です。これらのイベントは、「ファイル」プロデューサーにルーティングされます(当面の間)。

ラクダの本では、例は世論調査の消費者のためのものです。イベント駆動型の消費者向けの一般的なソリューションは見つかりませんでした。私はJMXの同様の実装に出くわしました:

public class JMXConsumer extends DefaultConsumer implements NotificationListener { 

JMXEndpoint jmxEndpoint;    
public JMXConsumer(JMXEndpoint endpoint, Processor processor) { 
    super(endpoint, processor);
    this.jmxEndpoint = endpoint;
}

public void handleNotification(Notification notification, Object handback) { 
    try {
        getProcessor().process(jmxEndpoint.createExchange(notification)); 
    } catch (Throwable e) {
        handleException(e); 
    }
}

}

ここでは、JMX通知が到着するたびにhandleNotificationが呼び出されます。

エージェントがアクションを生成するたびに消費者に通知を受け取るために、同様のことをしなければならないと思います。ただし、上記のhandleNotificationメソッドはJMXに固有のものです。Webページには次のように書かれています。「独自のイベント駆動型コンシューマーを実装する場合は、カスタムコンシューマーに実装する類似のイベントリスナーメソッドを特定する必要があります。」

知りたいのは、類似のイベントリスナーを特定して、エージェントがアクションを実行するたびにコンシューマーに通知されるようにする方法です。

ウェブページへのアドバイス/リンクは大歓迎です。

4

2 に答える 2

5

私はこれが古い質問であることを知っていますが、私はそれに苦労していて、答えを探している他の人のために私の発見を文書化すると思っていました。

Endpointクラスを作成する(DefaultEndpointを拡張する)場合、コンシューマーを作成するための次のメソッドをオーバーライドします。

public Consumer createConsumer(Processor processor)

コンシューマーでは、プロセッサーにアクセスできます。このプロセッサーで「プロセス」を呼び出すと、イベントが作成され、ルートがトリガーされます。

たとえば、メッセージをリッスンするJava APIがあり、ある種のリスナーがあるとします。私の場合、リスナーは着信メッセージをLinkedBlockingQueueに配置し、コンシューマーの'doStart'メソッドは次のようになります(独自のエラー処理を追加します)。

@Override
protected void doStart() throws Exception {
    super.doStart();

    // Spawn a new thread that submits exchanges to the Processor
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            while(true) {
                IMessage incomingMessage = myLinkedBlockingQueue.take();
                Exchange exchange = getEndpoint().createExchange();
                exchange.getIn().setBody(incomingMessage);
                myProcessor.process(exchange);  
            }
        }
    };
    new Thread(runnable).start();
}

これで、このコンシューマーを作成するエンドポイントを作成するコンポーネントをCamelContextに配置し、次のように使用できます。

from("mycomponent:incoming").to("log:messages");

また、ログメッセージは、JavaAPIから新しいメッセージが到着するたびに発生します。

それが誰かを助けることを願っています!

于 2015-08-19T08:59:36.343 に答える
4

イベント駆動型はラクダです。

どのルートも実際にはイベントリスナーです。

与えられたルート:

from("activemq:SomeQueue").
  bean(MyClass.class);

public class MyBean{
  public void handleEvent(MyEventObject eventPayload){ // Given MyEventObject was sent to this "SomeQueue".
     // whatever processing.
  }
}

それはイベント駆動型の消費者を生み出すでしょう。では、イベントを送信するにはどうすればよいですか?アプリにラクダが埋め込まれていて、イベントアクションジェネレーターからCamelContextにアクセスしている場合は、そこからプロデューサーテンプレートを取得して、「seda:SomeQueue」など、Camelで定義したエンドポイントにイベントを発生させることができます。

それ以外の場合、Camelインスタンスがアプリケーション以外のサーバーまたはインスタンスで実行されている場合は、SEDAではなく他のトランスポートを使用する必要があります。できればJMSですが、他の人も同様に選択します。ActiveMQが私のお気に入りです。組み込みのactivemqインスタンス(JVM内)を簡単に開始し、次の方法でラクダに接続できます。

camelContext.addComponent("activemq", activeMQComponent("vm://localhost"));
于 2012-08-14T09:33:20.163 に答える