나는 비교적 Camel에 익숙하지 않아 MyBatis를 사용하여 ActiveMQ 큐를 "먹이는"간단한 경로 문제로 고생하고 있습니다. 다음과 같이Camel route and MyBatis
내 경로는 다음과 같습니다
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 개의 행을 가진 1 개의 메시지를 얻습니다.
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>
것은 내가 감사 할 것이다!
는 편집 : 는 그냥 분배기 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)은 낙타의 context.xml 파일에 선언해야합니다
<bean id="xdrMessageSplitterBean" name="xdrMessageSplitterBean"
class="package.of.bean.XdrMessageSplitterBean" />
그것은 작동 우선은이 클래스를 생성 ,하지만 옳다고 느끼지는 않습니다. 누구든지 어떤 제안이라도 있으면 그것은 매우 환영받을 것입니다.
안녕하세요 @ claus-ibsen, 답장을 보내 주셔서 감사합니다. 나는 당신의 제안에 따라 나의 길을 더 쉽게 만들 수 있었다. 맞춰, 내 모든 문제를 해결했다. 이유는 모르겠지만 지연 옵션을 추가하고 타이머를 제거하면 다른 옵션 (consumer.useIterator 및 consumer.onConsumer)이 제대로 작동합니다. 너는 어떤 생각을 가지고 있니? 다시 한 번 감사드립니다! – ederribeiro
예 consumer.xxx 옵션은 엔드 포인트가 DSL 라우트의 from에서와 같이 소비자로 선언 된 경우에만 작동합니다. DSL의 "to"에 끝점을 선언하면 대신 해당 제작자가됩니다. –
이제 알았어요! 감사! – ederribeiro