2

実世界に適用するために、activemq + camel を学習しようとしています。キューを消費し、メッセージを処理して別のキューに移動する必要があります。

私の懸念はパフォーマンスに関するものです。毎日少なくとも 100.000 件のメッセージを処理する必要があります。現時点では、垂直方向または水平方向のスケーリングには対応したくありません (テクノロジーが優れていると人々が確信するまで、これ以上の費用はかけられません)。

そこで、キューをポーリングし、メッセージを消費、処理、および他のキューに移動するいくつかのスレッドを開始することを考えました。スレッドの数は、増加する負荷レベルにハードウェアがどのように応答するかによって異なります。

私の最初の質問は次のとおりです。これは良いアプローチですか (並列スレッドを開始してキューを消費します)?

2 番目の質問は、Camel In Action を読むことから学習を始めたことです。何かが欠けているかどうかはわかりませんが、コンシューマーを構築する方法について少し混乱しています。FtpToJMSExample の書籍の例を適応させることで、以下のコードが得られました。実際には、スレッドごとに接続を作成することはありません。アプリケーション サーバー (glassfish) が提供する接続プールを使用します。

public class JMSToJMSExample {
    public static void main(String args[]) throws Exception {
        CamelContext context = new DefaultCamelContext();
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://localhost");
        context.addComponent("jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
        context.addRoutes(new RouteBuilder() {
            public void configure() {
                from("jms:in")
                  .process(new CustomProcessor())
                  .to("jms:out");
} });
        context.start();
        Thread.sleep(10000);
        context.stop();
    }
}

それは正常に動作します。しかし、本はそれを「ポーリング」ソリューションと呼んでいます。while ループのようなものを期待していたので、キューにメッセージがある間は消費し続けます。わかりました、例はキューをポーリングしていますが、上記の例での私のポイントは、スリープ期間を短縮すると、可能なすべてのメッセージを処理せずに終了するということです。

とにかく、スレッドが起動するたびに接続プールに接続を要求するのではなく、長時間実行されるスレッドを確立する方が良いと思います。

私が学んでいるので、時間/期間でポーリングするのではなく、空になるまで jms キューをポーリングするスレッドを作成する方法の例を教えてください。

ティア、

ボブ

4

2 に答える 2

2

1)並行処理には seda http://camel.apache.org/seda.htmlを使用します。

             from("jms:in")
             .to("seda:seda1");

             from("seda:sead1?concurrentConsumers=10")
             .process(new CustomProcessor())
             .to("jms:out");

2) Camel を実行し続ける方法についてhttp://camel.apache.org/running-camel-standalone-and-have-it-keep-running.htmlを読んでください。

于 2013-02-28T05:01:02.340 に答える
0

いくつかのこと...

  • あなたの質問に対して、「これは良いアプローチですか(キューを消費するために並列スレッドを開始する)?」絶対に、これは非常に一般的なデザインパターンです
  • CamelContextが実行されている限り(ループやタイマーは必要ありません)、ルートは消費し続けます。http://camel.apache.org/running-camel-standalone-and-have-it-keepを参照してください。 -running.html
  • ルートは次のようになります。maxConcurrentConsumersプロパティは、複数のコンシューマスレッドがINキューからメッセージをプルし、処理してOUTキューにプッシュする必要があることを示していることに注意してください。

    from("jms:in?maxConcurrentConsumers=10")
    .process(new CustomProcessor())
    .to("jms:out);
    

詳細については、 http://camel.apache.org/activemq.htmlを参照してください。

于 2013-03-03T06:17:14.370 に答える