1

最近、私は問題を思いつきました。Camel アプリケーションで、同時に提供される接続を制限する方法。最初に私はスロットル EIP について考えましたが、それについて読んだ後、それを使用することを検討せず、それは私のニーズに合わないと結論付けました. 1 秒あたり最大 10 メッセージで構成された Throttler は、10 の要求が組み合わされて数ミリ秒で処理されたとしても、私のメッセージング システムを通過できるのはこれだけです。10 の同時接続を提供する必要があります。これは、毎秒数百のメッセージのスループットを持つことができることを意味しますが、10 接続の制限を超えることはできません。それを超えた場合は、一度に 10 を超える接続を使用することは許可されていないことを呼び出し元に例外を返さなければなりません。彼のリクエストをキューに入れることはできません。

その後、SEDA コンポーネントがまさに必要なことを実行してくれることがわかりました。10 個の parallelConsumers と 0 (ゼロ) のキュー サイズを使用すると、同時に処理される接続数が 10 に制限され、すべての新しい接続が拒否されます。問題は、Camel 2.10.3 での SEDA の動作です。「size=0」を設定すると、自動的に Integer.MAX_VALUE (jConsole で確認) が使用されます。キューを「1」に設定すると、期待どおりに機能しますが、キューをまったく持つことができません。

Camel SEDA のソース コードを検索すると、SEDA キューに LinkedBlockingQueue を使用していることがわかります。これは容量を 0 にすることはできません。したがって、デフォルトのコンストラクターが使用され、実際にはキューに Integer.MAX_VALUE が使用されます。

何か不足していますか?私の問題を解決するための他の選択肢はありますか?

どんな助けでも大歓迎です!

4

2 に答える 2

1

最小/最大スレッドを指定できるスレッドプールを使用して、スレッドを使用してメッセージを同時に実行することもできます。

from(somewhere)
   .threads(10)
   .to(a)
   .to(b)

このページの下部にある詳細: http://camel.apache.org/async.html

于 2013-01-26T10:29:45.347 に答える
0

接続には多くの意味がありますが、ルート内の飛行中の交換の数を制限したいと考えています。jetty コンポーネントなど、このようなものが組み込まれているコンポーネントがいくつかあります (非同期処理を行わない場合)。一般的なケースでは、ルート ポリシーを使用できます。独自のものを作成する必要があるかもしれませんが、それはかなり単純なはずです。提供された ThrottlingInFlightRoutePolicy は、あなたの場合には粗すぎると思います。

于 2013-01-26T07:21:09.517 に答える