Fuse 6 is no longer supported
As of February 2025, Red Hat Fuse 6 is no longer supported. If you are using Fuse 6, please upgrade to Red Hat build of Apache Camel.第144章 SEDA
SEDA コンポーネント リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
キューは 単一 の CamelContext 内でのみ表示されることに注意してください。
CamelContext
インスタンス(Web アプリケーション間の通信など)間で通信する場合は、仮想マシン コンポーネントを参照してください。
このコンポーネントは、メッセージの処理中に仮想マシンが終了した場合に、永続性やリカバリーを実装しません。永続性、信頼性、または分散 SEDA が必要な場合は、JMS または ActiveMQ のいずれかを使用してください。
同期
Direct コンポーネントは、プロデューサーがメッセージエクスチェンジを送信するときに、コンシューマーの同期呼び出しを提供します。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
seda:queueName[?options]
seda:queueName[?options]
queueName
には、現在の CamelContext 内のエンドポイントを一意に識別する任意の文字列を指定できます。
URI にクエリーオプションは
?option=value&option=value&.. の形式で追加できます。
注記
コンシューマーをプロデューサーエンドポイントに一致させると、
queueName
のみが考慮され、オプション設定は無視されます。つまり、コンシューマーエンドポイントのアイデンティティーは queueName
にのみ依存します。複数のコンシューマーを同じキューに割り当てる場合は、「multipleConsumers の使用」 で説明されている方法を使用します。
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
名前 | デフォルト | 説明 |
---|---|---|
size
|
unbounded | SEDA キューの最大容量(つまり、保持できるメッセージの数)。注: このオプションを使用する場合、キュー名で最初のエンドポイントが作成され、サイズを決定するのは最小限です。すべてのエンドポイントが同じサイズを使用するようにするには、すべてのエンドポイントで size オプションを設定するか、作成される最初のエンドポイントを設定します。Camel 2.11 以降では、同じキュー名に混合キューサイズを使用すると、Camel はこれを検出し、エンドポイントの作成に失敗するように検証が行われます。 |
concurrentConsumers
|
1
|
Apache Camel 1.6.1/2.0: 同時スレッド処理エクスチェンジの数。 |
waitForTaskToComplete
|
IfReplyExpected
|
非同期タスクが完了するまで呼び出し元が待機するかどうかを指定するオプション。Always 、Never 、または IfReplyExpected の 3 つのオプションがサポートされます。最初の 2 つの値は自己説明です。最後の値 IfReplyExpected は、メッセージが Request Reply-based である場合にのみ待機します。デフォルトのオプションは IfReplyExpected です。非同期メッセージングの詳細は、非同期 メッセージング を参照してください。
|
timeout
|
30000
|
Apache Camel 2.0: Timeout in millis a seda producer will at most waiting for an async task to complete.詳細は、waitForTaskToComplete および Async を参照してください。Camel 2.2 では、0 または負の値を使用してタイムアウトを無効にできるようになりました。
|
multipleConsumers
|
false
|
Camel 2.2: 複数のコンシューマーを許可するかどうかを指定します。有効にすると、メッセージングの公開/サブスクライブスタイルに SEDA を使用できます。SEDA キューにメッセージを送信し、複数のコンシューマーがメッセージのコピーを受信します。 |
limitConcurrentConsumers
|
true
|
Camel 2.3: concurrentConsumers を最大 500 に制限するかどうか。数値が大きい で設定された場合は、例外が発生します。このオプションをオフにすると、このチェックを無効にできます。 |
blockWhenFull
|
false
|
メッセージを完全な SEDA キューに送信するスレッドが、キューの容量が枯渇しなくなるまでブロックされるかどうか。デフォルトでは、キューがいっぱいであることを示す例外が出力されます。このオプションを有効にすると、呼び出しスレッドは代わりにブロックされ、メッセージが受け入れられるまで待機します。 |
queueSize
|
コンポーネントのみ: SEDA キューのデフォルトサイズ(保持可能なメッセージ数の容量)。このオプションは、サイズ が使用されていない場合に使用されます。
|
|
pollTimeout
|
1000
|
コンシューマーのみ: ポーリング時に使用されるタイムアウト。タイムアウトが発生すると、コンシューマーは実行を継続できるかどうかを確認できます。値を低く設定すると、シャットダウン時にコンシューマーがより迅速に対応できるようになります。 |
purgeWhenStopping
|
false
|
コンシューマー/ルートを停止するときにタスクキューをパージするかどうか。キューの保留中のメッセージは破棄されるため、はより迅速に停止できます。 |
queue
|
null
|
seda エンドポイントで使用されるキューインスタンスを定義します。 |
queueFactory
|
null
|
seda エンドポイントのキューを作成できる QueueFactory を定義します。 |
failIfNoConsumers
|
false
|
アクティブなコンシューマーのない SEDA キューに送信する際に、プロデューサーが例外を出力して失敗するかどうか。オプション discardIfNoConsumers と failIfNoConsumers を同時に有効にできるのは 1 つだけです。
|
discardIfNoConsumers
|
false
|
アクティブなコンシューマーのない SEDA キューに送信する際に、プロデューサーがメッセージを破棄するかどうか(メッセージをキューに追加しないでください)。オプション discardIfNoConsumers と failIfNoConsumers を同時に有効にできるのは 1 つだけです。
|
BlockingQueue 実装の選択 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.12 以降で利用可能
デフォルトでは、SEDA コンポーネントは常に LinkedBlockingQueue になりますが、異なる実装を使用できます。この場合、size オプションは使用されません。
または、BlockingQueueFactory 実装を参照することもできます。3 つの実装は LinkedBlockingQueueFactory、ArrayBlockingQueueFactory、および PriorityBlockingQueueFactory で提供されます。
リクエスト応答の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
from("mina:tcp://0.0.0.0:9876?textline=true&sync=true").to("seda:input"); from("seda:input").to("bean:processInput").to("bean:createResponse");
from("mina:tcp://0.0.0.0:9876?textline=true&sync=true").to("seda:input");
from("seda:input").to("bean:processInput").to("bean:createResponse");
上記のルートでは、受信リクエストを受け入れるポート 9876 の TCP リスナーがあります。リクエストは
seda:input
キューにルーティングされます。Request Reply メッセージであるため、応答を待ちます。seda:input
キューのコンシューマーが完了すると、応答が元のメッセージの応答にコピーされます。
2.2 まで:2 つのエンドポイントでのみ機能する
同時コンシューマー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、SEDA エンドポイントは単一のコンシューマースレッドを使用しますが、同時コンシューマースレッドを使用するように設定できます。そのため、スレッドプールの代わりに以下を使用できます。
from("seda:stageName?concurrentConsumers=5").process(...)
from("seda:stageName?concurrentConsumers=5").process(...)
スレッドプールと同時コンシューマーの違い リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
スレッドプール は、負荷に応じてランタイム時に動的に拡大/縮小できるプールですが、同時コンシューマーは常に固定されます。
スレッドプール リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
以下のようにしてスレッドプールを SEDA エンドポイントに追加することに注意してください。
from("seda:stageName").thread(5).process(...)
from("seda:stageName").thread(5).process(...)
は、SEDA エンドポイントからの 2 つの
BlockQueues
と、スレッドプールの workqueue からの 1 つで優先され、望ましいものではない可能性があります。代わりに、スレッドプールで Direct エンドポイントを設定することを検討してください。これは、同期的かつ非同期的にメッセージを処理できます。以下に例を示します。
from("direct:stageName").thread(5).process(...)
from("direct:stageName").thread(5).process(...)
concurrentConsumers
オプションを使用して SEDA エンドポイントでメッセージを処理するスレッド数を直接設定することもできます。
例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
以下のルートでは、SEDA キューを使用してこの非同期キューにリクエストを送信し、別のスレッドでさらに処理するために fire-and-forget メッセージを送信し、このスレッドの定数応答を元の呼び出し元に返します。
ここでは、Hello World メッセージを送信し、応答が OK であることが想定されます。
Object out = template.requestBody("direct:start", "Hello World"); assertEquals("OK", out);
Object out = template.requestBody("direct:start", "Hello World");
assertEquals("OK", out);
Hello World メッセージは、さらに処理するために別のスレッドから SEDA キューから消費されます。これはユニットテストからのものであるため、ユニットテストでアサーションを実行できる
モック
エンドポイントに送信されます。
multipleConsumers の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2.2 で利用可能
この例では、2 つのコンシューマーを定義し、Spring Bean として登録しました。
seda foo エンドポイントに multipleConsumers=true を指定しているため、これら 2 つのコンシューマーは、種類の pub-sub スタイルのメッセージングとしてメッセージの独自のコピーを受け取ることができます。
Bean はユニットテストの一部であるため、単にモックエンドポイントにメッセージを送信しますが、@Consume を使用して seda キューから消費する方法に注目してください。
キュー情報の抽出。 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
必要な場合、以下のように JMX を使用せずにキューサイズなどの情報を取得することもできます。
SedaEndpoint seda = context.getEndpoint("seda:xxxx"); int size = seda.getExchanges().size()
SedaEndpoint seda = context.getEndpoint("seda:xxxx");
int size = seda.getExchanges().size()