2012-09-24 2 views
1

나는 비교적 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" /> 

그것은 작동 우선은이 클래스를 생성 ,하지만 옳다고 느끼지는 않습니다. 누구든지 어떤 제안이라도 있으면 그것은 매우 환영받을 것입니다.

답변

2

mybatis에서 직접 소비하고 폴링 빈도를 지정할 수 있습니다. 당신은 타이머가 필요 없다. 지연 옵션을 사용하여 5 초 동안 = 5000을 설정할 수 있습니다.

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

안녕하세요 @ claus-ibsen, 답장을 보내 주셔서 감사합니다. 나는 당신의 제안에 따라 나의 길을 더 쉽게 만들 수 있었다. 맞춰, 내 모든 문제를 해결했다. 이유는 모르겠지만 지연 옵션을 추가하고 타이머를 제거하면 다른 옵션 (consumer.useIterator 및 consumer.onConsumer)이 제대로 작동합니다. 너는 어떤 생각을 가지고 있니? 다시 한 번 감사드립니다! – ederribeiro

+0

예 consumer.xxx 옵션은 엔드 포인트가 DSL 라우트의 from에서와 같이 소비자로 선언 된 경우에만 작동합니다. DSL의 "to"에 끝점을 선언하면 대신 해당 제작자가됩니다. –

+0

이제 알았어요! 감사! – ederribeiro

0

나는 올바른 방법을 찾았다 고 말하고 싶습니다. 해결 방법이라고 생각해서는 안됩니다.

사실 mybatis가 List를 반환하기 때문에 "XdrMessageSplitterBean"이 필요하지는 않습니다.

+0

안녕하세요 @Petter, 답장을 보내 주셔서 감사합니다. 나는 커스텀 스플리터 빈없이 시도했고, 또한'.method ("xdrMessageSplitterBean", "splitBody")'를'.body()'로 바꿨다. 그것이 작동하더라도 나는 mbatis 설정 문자열에 대해 여전히 흥미를 끈다. 예제에서 '& consumer.useIterator = true & consumer.onConsume = updateProcessingSearchItem'은 아무런 영향을주지 않습니다. 작동하지 않습니다. 또한 결과를 독립적으로 처리하지도 않으며'updateProcessingSearchItem' 쿼리를 실행하지도 않습니다. 그것에 대한 생각이 있습니까? – ederribeiro