骆驼路线和MyBatis

时间:2012-09-24 22:26:57

标签: apache-camel dsl mybatis

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

如果有人能透露一点,我会感激不尽!

编辑:

使用Splitter EIP找到一个解决方法。首先我创建了这个类:

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

必须在camel-context.xml文件中声明bean:

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

它有效,但感觉不对。如果有人有任何建议,将非常欢迎。

2 个答案:

答案 0 :(得分: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");
    }

答案 1 :(得分:0)

我会说你找到了正确的方法。你不应该认为这是一种解决方法。

实际上,由于mybatis返回一个List,我甚至不确定你需要“XdrMessageSplitterBean”。