Прямая обработка в Apache Camel - PullRequest
3 голосов
/ 03 апреля 2012

Я заинтересован в поиске лучшего способа прямой обработки в Apache Camel.

У меня есть несколько разных компонентов, которые я могу запустить в одной и той же JVM, отдельно от моего брокера activemq. Имеет ли смысл пытаться настроить его так, чтобы мои сообщения передавались от одного компонента к другому, по порядку, блокируя? Как мне настроить верблюда, чтобы каждое сообщение попадало в каждый компонент на маршруте до запуска следующего сообщения?

Чтобы быть более конкретным: я хотел бы сделать это через конфигурацию моего brokerURI или что-то в этом роде. Я видел эту страницу: http://fusesource.com/wiki/display/ProdInfo/Understanding+the+Threads+Allocated+in+ActiveMQ, но я не уверен, где / как реализовать параметры - optimizedDispatch, похоже, работал с параметрами брокера destinationPolicy.

Спасибо

1 Ответ

5 голосов
/ 03 апреля 2012

для начала, явно настройте одного потребителя в ваших маршрутах, которые потребляют из очередей ...

либо глобально для всех соединений

<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory" ref="pooledConnectionFactory"/>
    <property name="concurrentConsumers" value="1"/>
    <property name="maxConcurrentConsumers" value="1"/>
</bean>

или явно для маршрута / потребителя

 from("activemq:queue:input?concurrentConsumers=1&maxConcurrentConcumers=1")...

тогда у вас есть несколько вариантов. Как правило, вы можете использовать шаблон конвейера для передачи сообщений между шагами (синхронно) по одному маршруту. Или используйте camel-direct для обеспечения синхронного потока сообщений между несколькими маршрутами.

from("activemq:queue:input?concurrentConsumers=1&maxConcurrentConcumers=1")
    .to(<step1>)
    .to(<step2>)
    ...

или если ваши шаги требуют нескольких маршрутов, подключите их, используя прямой ...

from("activemq:queue:input?concurrentConsumers=1&maxConcurrentConsumers=1")
    .to("direct:step1");

from("direct:step1")
    //perform step1 processing
    .to(direct:step2");

from("direct:step2")
    //perform step2 processing
    .to(direct:step3");
...
...