Верблюжий маршрут и 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, спасибо за ваш ответ. Я пробовал без специального компонента-разделителя, и это также сработало (я изменил .method("xdrMessageSplitterBean", "splitBody") на .body()). Хотя это работает, я все еще заинтригован строкой конфигурации mbatis; в моем примере &consumer.useIterator=true&consumer.onConsume=updateProcessingSearchItem не влияет, не работает. Он также не обрабатывает результаты независимо и не выполняет запрос updateProcessingSearchItem. У вас есть какие-то мысли по этому поводу? - person ederribeiro; 25.09.2012