3

スプリッターと同様に、1 つの入力を受け取り、複数の出力メッセージを生成する Camel コンポーネント/プロセッサーを実装しようとしています。Splitter と同様に、出力はルート内の次のプロセッサ/エンドポイントに送られる必要があります。

Splitter クラスと MulticastProcessor クラスを調べて、それらを再利用したり、同様のロジックを使用したりできるようにしました。私が理解したように、アイデアは、出力ごとに新しい Exchange を作成し、それらを発行することです。これを行うには、出力が書き込まれるエンドポイントを提供する必要があります。これは、Processor クラス内でエンドポイントを動的に作成すると機能します。私の要件は、ルートで構成されたエンドポイントに出力を送信することです。それは以下のルートにあり、mycomponent は file:output に (複数回) 書き込む必要があります。

    <route>
        <from uri="file:input"/>
        <to uri="mycomponent:OrderFlow?multi.output=true"/>
        <to uri="file:output" />
    </route>

スプリッターの場合、出力プロセッサー/エンドポイントにアクセスできる SplitDefinition クラスによってインスタンス化されます。

a) プロセッサ内から、構成された出力プロセッサ/エンドポイントにアクセスできますか?

b) そうでない場合、プロセッサの ProcessorDefinition クラスを作成する必要がありますか? これに関する指針があれば役立ちます。

ペッターが以下に提案する2つの解決策は、

a) Producer テンプレートを挿入する b) 新しいコンポーネントを作成する代わりに、メソッド呼び出しで Splitter コンポーネントを使用する。

4

1 に答える 1

2

あなたはこのページを読んでいると思います。

はい、カスタム プロセッサから複数の交換を送信できますが、実際にはフロー内の次のプロセッサには送信できません。上記のリンクのように、プロデューサー テンプレートに特定の宛先を挿入することで、コンポーネントの実装を切り離すことができます。direct または seda トランスポートを使用してルートをいくつかの部分に分割し、コンポーネントにそこにメッセージを送信させることができます。このようにして、いくつかのルートでコードを再利用できます。

ご指摘のとおり、これは Camel コアのスプリッター コンポーネント (とりわけ) で行われます。たとえば、 multicastprocessor ベースクラスを見てください。ただし、ルートビルダーのおかげで、プロセッサはルート内の次のプロセッサを認識しています。カスタム プロセッサはそれほど幸運ではありません。

それでも、CamelContext からその情報を抽出できます。ルートを取得すると、ルート内のプロセッサーを見つけることができます。ただし、それは物事を複雑にしすぎているようです。

更新: DSL を変更しようとする代わりに、既存の DSL とコンポーネントを利用してください。

.split().method("mycomponent", "OrderFlow")

新しい交換を発行する代わりに、OrderFlow メソッドは、結果のメッセージで List<..> を作成するだけで済みます。

于 2014-03-01T13:24:19.607 に答える