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