Apache camel 骆驼路线与MyBatis
我对Camel比较陌生,我一直在努力解决一个问题,即使用MyBatis“馈送”ActiveMQ队列的简单路由 我的路线如下:Apache camel 骆驼路线与MyBatis,apache-camel,dsl,mybatis,Apache Camel,Dsl,Mybatis,我对Camel比较陌生,我一直在努力解决一个问题,即使用MyBatis“馈送”ActiveMQ队列的简单路由 我的路线如下: public class SearchItemProductionRouteRoute extends SpringRouteBuilder { @Override public void configure() throws Exception { from("timer://pollTheDatabase?delay=5000")
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行
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>
必须在camel-context.xml文件中声明bean:
<bean id="xdrMessageSplitterBean" name="xdrMessageSplitterBean"
class="package.of.bean.XdrMessageSplitterBean" />
它能起作用,但感觉不对劲。如果有人有任何建议,我们将非常欢迎。我认为你找到了正确的方法。你不应该认为这是个解决办法。< / P>
实际上,由于mybatis返回一个列表,我甚至不确定您是否需要“XDRMessageSpliterBean”。您可以直接使用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");
}
嗨@Petter,谢谢你的回复。我尝试过不使用自定义拆分器bean,但它也起了作用(我将
方法(“xdrMessageSplitterBean”,“splitBody”)
更改为.body()
)。虽然它可以工作,但我仍然对mbatis配置字符串感兴趣;在我的示例中,&consumer.usediator=true&consumer.onConsume=updateProcessingSearchItem
没有影响,它不起作用。它也不会独立处理结果,也不会执行updateProcessingSearchItem
查询。你对此有什么想法吗?嗨,克劳斯·易卜生,谢谢你的回复。我听从了你的建议,这样我的路线就更简单了。猜猜看,它解决了我所有的问题。我不明白为什么,但是添加了延迟选项并删除了计时器,使其他选项(consumer.usediator和consumer.onConsumer)正常工作。你知道吗?再次感谢!是,consumer.xxx选项仅在端点在路由DSL的from中声明为consumer时有效。当您在DSL中的“to”中声明端点时,它将改为生产者。
<bean id="xdrMessageSplitterBean" name="xdrMessageSplitterBean"
class="package.of.bean.XdrMessageSplitterBean" />
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");
}