Apache camel 骆驼路线与MyBatis

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")

我对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行

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");
    }