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 行的消息。

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

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 回答