私は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" />
それは機能しますが、正しく感じません。誰か提案があれば大歓迎です。