我对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" />
它有效,但感觉不对。如果有人有任何建议,将非常欢迎。
答案 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”。