Камилски маршрут и MyBatis

Аз съм сравнително нов в 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" />

Работи, но не се чувства добре. Ако някой има някакво предложение, то ще бъде много добре дошло.


person ederribeiro    schedule 24.09.2012    source източник


Отговори (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");
    }
person Claus Ibsen    schedule 25.09.2012
comment
Здравей @claus-ibsen, благодаря за отговора. Следвах вашето предложение, за да може маршрутът ми да бъде още по-прост. Познайте какво, това реши всичките ми проблеми. Не разбирам защо, но добавянето на опцията за забавяне и премахването на таймера направи другите опции (consumer.useIterator и consumer.onConsumer) да работят както трябва. Имаш ли представа Благодаря отново! - person ederribeiro; 25.09.2012
comment
Да, опциите consumer.xxx работят само ако крайната точка е декларирана като потребител, напр. в DSL от в маршрута. Когато декларирате крайната точка в to в DSL, тогава тя е производител вместо това. - person Claus Ibsen; 25.09.2012

Бих казал, че сте намерили правилния начин да го направите. Не трябва да го смятате за заобиколно решение.

Всъщност, тъй като mybatis връща списък, дори не съм сигурен, че имате нужда от "XdrMessageSplitterBean".

person Petter Nordlander    schedule 25.09.2012
comment
Здравей @Petter, благодаря за отговора ти. Опитах без персонализирания разделител bean и също проработи (промених .method("xdrMessageSplitterBean", "splitBody") на .body()). Въпреки че работи, все още съм заинтригуван относно конфигурационния низ на mbatis; в моя пример &consumer.useIterator=true&consumer.onConsume=updateProcessingSearchItem няма влияние, не работи. Нито третира резултатите независимо, нито изпълнява updateProcessingSearchItem заявката. Имате ли някакви мисли за това? - person ederribeiro; 25.09.2012