第144章 SEDA


SEDA コンポーネント

seda: コンポーネントは非同期 SEDA 動作を提供するため、メッセージは BlockingQueue で交換され、コンシューマーはプロデューサーとは別のスレッドで呼び出されます。
キューは 単一CamelContext 内でのみ表示されることに注意してください。CamelContext インスタンス(Web アプリケーション間の通信など)間で通信する場合は、仮想マシン コンポーネントを参照してください。
このコンポーネントは、メッセージの処理中に仮想マシンが終了した場合に、永続性やリカバリーを実装しません。永続性、信頼性、または分散 SEDA が必要な場合は、JMS または ActiveMQ のいずれかを使用してください。
同期
Direct コンポーネントは、プロデューサーがメッセージエクスチェンジを送信するときに、コンシューマーの同期呼び出しを提供します。

URI 形式

seda:queueName[?options]
Copy to Clipboard Toggle word wrap
queueName には、現在の CamelContext 内のエンドポイントを一意に識別する任意の文字列を指定できます。
URI にクエリーオプションは ?option=value&option=value&.. の形式で追加できます。
注記
コンシューマーをプロデューサーエンドポイントに一致させると、queueName のみが考慮され、オプション設定は無視されます。つまり、コンシューマーエンドポイントのアイデンティティーは queueName にのみ依存します。複数のコンシューマーを同じキューに割り当てる場合は、「multipleConsumers の使用」 で説明されている方法を使用します。

オプション

Expand
名前 デフォルト 説明
size unbounded SEDA キューの最大容量(つまり、保持できるメッセージの数)。注: このオプションを使用する場合、キュー名で最初のエンドポイントが作成され、サイズを決定するのは最小限です。すべてのエンドポイントが同じサイズを使用するようにするには、すべてのエンドポイントで size オプションを設定するか、作成される最初のエンドポイントを設定します。Camel 2.11 以降では、同じキュー名に混合キューサイズを使用すると、Camel はこれを検出し、エンドポイントの作成に失敗するように検証が行われます。
concurrentConsumers 1 Apache Camel 1.6.1/2.0: 同時スレッド処理エクスチェンジの数。
waitForTaskToComplete IfReplyExpected 非同期タスクが完了するまで呼び出し元が待機するかどうかを指定するオプション。AlwaysNever、または 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 キューに送信する際に、プロデューサーが例外を出力して失敗するかどうか。オプション discardIfNoConsumersfailIfNoConsumers を同時に有効にできるのは 1 つだけです。
discardIfNoConsumers false アクティブなコンシューマーのない SEDA キューに送信する際に、プロデューサーがメッセージを破棄するかどうか(メッセージをキューに追加しないでください)。オプション discardIfNoConsumersfailIfNoConsumers を同時に有効にできるのは 1 つだけです。

BlockingQueue 実装の選択

Camel 2.12 以降で利用可能
デフォルトでは、SEDA コンポーネントは常に LinkedBlockingQueue になりますが、異なる実装を使用できます。この場合、size オプションは使用されません。
<bean id="arrayQueue" class="java.util.ArrayBlockingQueue">
<constructor-arg index="0" value="10" ><!-- size -->
<constructor-arg index="1" value="true" ><!-- fairness -->
</bean>
<!-- ... and later -->
<from>seda:array?queue=#arrayQueue</from>
Copy to Clipboard Toggle word wrap
または、BlockingQueueFactory 実装を参照することもできます。3 つの実装は LinkedBlockingQueueFactory、ArrayBlockingQueueFactory、および PriorityBlockingQueueFactory で提供されます。
<bean id="priorityQueueFactory" class="org.apache.camel.component.seda.PriorityBlockingQueueFactory">
<property name="comparator">
<bean class="org.apache.camel.demo.MyExchangeComparator" />
</property>
</bean>
<!-- ... and later -->
<from>seda:priority?queueFactory=#priorityQueueFactory&size=100</from>
Copy to Clipboard Toggle word wrap

リクエスト応答の使用

SEDA コンポーネントは、リクエスト応答の使用 をサポート します。ここでは、呼び出し元は Async ルートが完了するまで待機します。たとえば、以下のようになります。
from("mina:tcp://0.0.0.0:9876?textline=true&sync=true").to("seda:input");

from("seda:input").to("bean:processInput").to("bean:createResponse");
Copy to Clipboard Toggle word wrap
上記のルートでは、受信リクエストを受け入れるポート 9876 の TCP リスナーがあります。リクエストは seda:input キューにルーティングされます。Request Reply メッセージであるため、応答を待ちます。seda:input キューのコンシューマーが完了すると、応答が元のメッセージの応答にコピーされます。
2.2 まで:2 つのエンドポイントでのみ機能する
SEDA または VM 上で リクエスト応答 を使用すると、2 つのエンドポイントでのみ機能します。A -> B -> C などに送信してエンドポイントを連鎖させることは できません。A -> B の間のみ。理由は、実装ロジックは非常に簡単です。3+ エンドポイントをサポートするために、待機中のスレッド間の順序付けと通知を適切に処理するためにロジックが複雑になります。
これは Camel 2.3 以降では改善され、必要な数だけエンドポイントを連鎖できるようになりました。

同時コンシューマー

デフォルトでは、SEDA エンドポイントは単一のコンシューマースレッドを使用しますが、同時コンシューマースレッドを使用するように設定できます。そのため、スレッドプールの代わりに以下を使用できます。
from("seda:stageName?concurrentConsumers=5").process(...)
Copy to Clipboard Toggle word wrap

スレッドプールと同時コンシューマーの違い

スレッドプール は、負荷に応じてランタイム時に動的に拡大/縮小できるプールですが、同時コンシューマーは常に固定されます。

スレッドプール

以下のようにしてスレッドプールを SEDA エンドポイントに追加することに注意してください。
from("seda:stageName").thread(5).process(...)
Copy to Clipboard Toggle word wrap
は、SEDA エンドポイントからの 2 つの BlockQueues と、スレッドプールの workqueue からの 1 つで優先され、望ましいものではない可能性があります。代わりに、スレッドプールで Direct エンドポイントを設定することを検討してください。これは、同期的かつ非同期的にメッセージを処理できます。以下に例を示します。
from("direct:stageName").thread(5).process(...)
Copy to Clipboard Toggle word wrap
concurrentConsumers オプションを使用して SEDA エンドポイントでメッセージを処理するスレッド数を直接設定することもできます。

以下のルートでは、SEDA キューを使用してこの非同期キューにリクエストを送信し、別のスレッドでさらに処理するために fire-and-forget メッセージを送信し、このスレッドの定数応答を元の呼び出し元に返します。
public void configure() throws Exception {
    from("direct:start")
        // send it to the seda queue that is async
        .to("seda:next")
        // return a constant response
        .transform(constant("OK"));

    from("seda:next").to("mock:result");
}
Copy to Clipboard Toggle word wrap
ここでは、Hello World メッセージを送信し、応答が OK であることが想定されます。
Object out = template.requestBody("direct:start", "Hello World");
assertEquals("OK", out);
Copy to Clipboard Toggle word wrap
Hello World メッセージは、さらに処理するために別のスレッドから SEDA キューから消費されます。これはユニットテストからのものであるため、ユニットテストでアサーションを実行できる モック エンドポイントに送信されます。

multipleConsumers の使用

Camel 2.2 で利用可能
この例では、2 つのコンシューマーを定義し、Spring Bean として登録しました。
<!-- define the consumers as spring beans -->
<bean id="consumer1" class="org.apache.camel.spring.example.FooEventConsumer"/>

<bean id="consumer2" class="org.apache.camel.spring.example.AnotherFooEventConsumer"/>

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <!-- define a shared endpoint which the consumers can refer to instead of using url -->
    <endpoint id="foo" uri="seda:foo?multipleConsumers=true"/>
</camelContext>
Copy to Clipboard Toggle word wrap
seda foo エンドポイントに multipleConsumers=true を指定しているため、これら 2 つのコンシューマーは、種類の pub-sub スタイルのメッセージングとしてメッセージの独自のコピーを受け取ることができます。
Bean はユニットテストの一部であるため、単にモックエンドポイントにメッセージを送信しますが、@Consume を使用して seda キューから消費する方法に注目してください。
public class FooEventConsumer {

    @EndpointInject(uri = "mock:result")
    private ProducerTemplate destination;

    @Consume(ref = "foo")
    public void doSomething(String body) {
        destination.sendBody("foo" + body);
    }

}
Copy to Clipboard Toggle word wrap

キュー情報の抽出。

必要な場合、以下のように JMX を使用せずにキューサイズなどの情報を取得することもできます。
SedaEndpoint seda = context.getEndpoint("seda:xxxx");
int size = seda.getExchanges().size()
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat