3

ActiveMQ サービス内にデプロイされた Apache Camel モジュールを使用します。

Spring DSL を使用routeContextし、ファイルにルート定義 ( として実装) があるとしFilteringRouteContext.xmlます (簡略化):

<routeContext id="filteringRouteContext" xmlns="http://camel.apache.org/schema/spring">
    <route id="myFilteringRoute">
        <from uri="direct:filteringRoute"/>
        <idempotentConsumer messageIdRepositoryRef="idempotentRepository" skipDuplicate="false">
            <simple>${header.JMSType}</simple>
            <filter>
                <property>CamelDuplicateMessage</property>
                <stop/>
            </filter>
        </idempotentConsumer>
    </route>
</routeContext>

次に、他の XML ファイルで Camel Context を構成しました (簡略化)。

<import resource="classpath:FilteringRouteContext.xml"/>

    <camelContext xmlns="http://camel.apache.org/schema/spring">

        <routeContextRef ref="filteringRouteContext"/>

        <route id="myRoute1">
            <from uri="activemq:topic:source1" />
            <to uri="direct:filteringRoute" />
            <to uri="activemq:topic:target1" />
        </route>

        <route id="myRoute2">
            <from uri="activemq:topic:source2" />
            <to uri="direct:filteringRoute" />
            <to uri="activemq:topic:target2" />
        </route>

        <route id="myRoute3">
            <from uri="activemq:topic:source3" />
            <to uri="direct:filteringRoute" />
            <to uri="activemq:topic:target3" />
        </route>

    </camelContext>

    <bean id="idempotentRepository"
          class="org.apache.camel.processor.idempotent.MemoryIdempotentRepository">
        <property name="cacheSize" value="10"/>
    </bean>

IoC 用語を使用して、依存関係ごとにインスタンスとして宣言された共有ルート (id=を使用myFilteringRoute)を使用したいので、単一の Camel コンテキスト (id= 、、を使用) からの各ルートは、その共有ルート (id を使用) の独自のインスタンスを使用する必要があります。 = )、個別の内部状態、Bean インスタンスなど。filteringRouteContextmyRoute1myRoute2myRoute3myFilteringRoute

つまり、Camel Context からの各ルート (id= myRoute1, myRoute2,を使用myRoute3)は、共有ルート(id=を使用) の同じインスタンスを使用してはなりませんmyFilteringRouteが、独自の完全に別個のインスタンス(完全に分離された内部状態と Bean インスタンスを使用)を持つ必要があります。

私の共有ルート ( id=を使用) は、myFilteringRouteさまざまなスコープ ( 、 など) を持つ可能性のあるより多くの Bean を使用する可能性があることをsingleton考慮してください。prototyperequest

私の質問は次のとおりです。単一の Camel コンテキストを使用してこの目標を達成できますか、または別の Camel コンテキストにルート (id= myRoute1myRoute2myRoute3) を配置する必要がありますか? 私の問題の最善の解決策は何ですか?

複数の Camel コンテキストを使用し、各コンテキストが Bean を使用して ActiveMQ ( org.apache.activemq.camel.component.ActiveMQComponent)、または内部リソースまたはシステム リソースを消費する他の Bean と通信する場合、パフォーマンスに重大な影響がありますか?

それとも、Spring DSL の代わりに Java DSL を使用して問題を解決した方がよいでしょうか?

ありがとうございました。

4

2 に答える 2

1

答えは、Camel には、やりたいことを自動的に実行するメカニズムが用意されていないということです。例のすべてのルートは、idempotentRepository の同じインスタンスを共有します。唯一の解決策は、一定レベルの間接化を提供することです。

たとえば、AbstractJdbcMessageIdRepository を拡張して、独自の実装を提供します。次に、ルックアップにルート ID を含めて、メッセージがすでに処理されているかどうかを判断できます。

または、一連のリポジトリを用意して、ルート ID に基づいてメインの idempotentRepository 内から使用するリポジトリを検索することもできます。

何をするにしても、最も外側のルートのルート ID を使用してメッセージを区別するコードを記述する必要があります。

于 2014-07-09T10:51:49.310 に答える
1

現在の Camel Spring DSL 定義は、xml を非整列化するときに JAXB によって作成されます。この定義は、camel ランタイムがプロセッサを構築し、それらを組み立ててメッセージをルーティングするのに役立ちます。このように、 routeContextRef はあなたが言及したスコープとは何の関係もありません。

ただし、Bean 要素を使用して Spring で作成した Bean の場合、必要に応じてスコープを定義できます。Camel Spring DSL に Bean 参照がある場合、camel は Spring Application Context からそれを取得するだけです。

質問に答えるために、routeContextRef はキャメル コンテキスト全体でルート定義インスタンスを共有する方法を提供するだけです。インスタンスを共有したくない場合は、routeContext の異なるインスタンスを保持できる異なる Spring アプリケーション コンテキストでキャメル コンテキストを作成する必要があります。 .

于 2014-06-19T02:19:49.640 に答える