Я относительно новичок в 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 записи из БД. Мне нужно, чтобы каждая строка стала сообщением в очереди, но вместо этого я получаю 1 сообщение со всеми 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 id="xdrMessageSplitterBean" name="xdrMessageSplitterBean"
class="package.of.bean.XdrMessageSplitterBean" />
Это работает, но не чувствует себя хорошо. Если у кого-то есть какие-либо предложения, это будет очень приветствоваться.