1

私はCamelに比較的慣れておらず、MyBatisを使用してActiveMQキューを「フィード」する単純なルートの問題に苦労しています。

私のルートは次のとおりです。

public class SearchItemProductionRouteRoute extends SpringRouteBuilder {
    @Override
    public void configure() throws Exception {
        from("timer://pollTheDatabase?delay=5000")
        .to("mybatis:selectSearchItem?statementType=SelectList&consumer.useIterator=true&consumer.onConsume=updateProcessingSearchItem")
        .to("bean:searchItemProcesser?method=process")
        .to("activemq:searchitemqueue");
    }
} 

mybatisクエリは正常に機能しています。クエリ自体は、データベースから4つのレコードを取得します。私の必要性は、各行がキュー内のメッセージになる必要がありますが、代わりに、4行すべてが含まれる1つのメッセージを受け取ります。

searchItemProcessorは、メッセージの本文を出力するだけです(これにより、メッセージに4つのレコードすべてが含まれていることがわかります)。

上記のルートで使用されるクエリは次のとおりです。

<select id="selectSearchItem" resultMap="result" parameterType="java.util.HashMap">
    SELECT * FROM SEARCH_REQUEST_ITEM SRI WHERE SRI.STATUS = '1' 
</select>

<update id="updateProcessingSearchItem">
    UPDATE SEARCH_REQUEST_ITEM SET STATUS = 2,   
    UPDATEDIN=SYSDATE, UPDATEDBY='XDRBATCH' 
    WHERE ID = #{ID}
</update>

誰かがこれに光を当てることができれば、私は感謝するでしょう!

編集:

SplitterEIPを使用して1つの回避策を見つけました。最初に私はこのクラスを作成しました:

public class XdrMessageSplitterBean {
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public List<HashMap> splitBody(Object body) {
        return (List<HashMap>) body;
    }
}

次に、それをルートに追加します。

    public void configure() throws Exception {
        from("timer://pollTheDatabase?delay=5000")
        .to("mybatis:selectSearchItem?statementType=SelectList&consumer.useIterator=true&consumer.onConsume=updateProcessingSearchItem")
        .split().method("xdrMessageSplitterBean", "splitBody")
        .to("bean:searchItemProcesser?method=process")
        .to("activemq:searchitemqueue");
    }

Beanは、camel-context.xmlファイルで宣言する必要があります。

    <bean id="xdrMessageSplitterBean" name="xdrMessageSplitterBean"
    class="package.of.bean.XdrMessageSplitterBean" />

それは機能しますが、正しく感じません。誰か提案があれば大歓迎です。

4

2 に答える 2

2

mybatis から直接消費し、ポーリング頻度を指定できます。そのためのタイマーは必要ありません。= 5000 を 5 秒の頻度に設定するために使用できる遅延オプションがあります。

public void configure() throws Exception {
        from("mybatis:selectSearchItem?statementType=SelectList&consumer.useIterator=true&consumer.onConsume=updateProcessingSearchItem&delay=5000")
        .split().method("xdrMessageSplitterBean", "splitBody")
        .to("bean:searchItemProcesser?method=process")
        .to("activemq:searchitemqueue");
    }
于 2012-09-25T12:24:49.593 に答える
0

私はあなたがそれをする正しい方法を見つけたと思います。回避策と見なすべきではありません。

実際、mybatisはリストを返すので、「XdrMessageSplitterBean」が必要かどうかさえわかりません。

于 2012-09-25T05:07:34.720 に答える