2012-05-05 5 views
1

Я не могу подключиться к маршруту верблюда, имеющему очередь SEDA. На стороне разорвать я следующие конфигурации:Подключиться к очереди Camel- SEDA

<camel:route> 
      <camel:from uri="seda:input"/> 
      <camel:log message =">>>>>data is : ${body}"/> 
      <camel:inOnly uri="activemq:queue:TESTQUEUE"/> 
     </camel:route> 

Я пытаюсь ударить этот маршрут от автономного клиента, как это:

public static void main(String[] args) { 

     CamelContext context = new DefaultCamelContext(); 
     producer = context.createProducerTemplate(); 
      producer.sendBody("seda:input","Hey"); 

} 

Но мой продюсер не может подключиться к очереди Седа. Невозможно попасть в очередь моего маршрута. Невозможно добавить camelContext в свой компонент bean. Я получаю «Недопустимое свойство« camelContext »класса bean. Если я отправляю тело в очередь SEDA, сообщение идет туда, но не к следующему элементу маршрута

ответ

5

Как предложил Петтер, вашему клиенту необходимо подключиться к одному и тому же контуру Camel, для которого определен маршрут SEDA. В вашем примере создается новый DefaultCamelContext() и пытается отправить сообщение до маршрут, определенный в другом контексте.

Вообще, я определить контекст верблюд в Spring XML, а затем придать контекст в любых классов, которые нуждаются в этом ...

<camelContext id="camelContext" xmlns="http://camel.apache.org/schema/spring"> 
    <routeBuilder ref="myRouter"/> 
</camelContext> 

<bean id="myClient" class="com.mycompany.MyClient"> 
    <property name="camelContext" ref="camelContext"/> 
</bean> 

Затем ваш клиентский код необходимо просто позвонить следующее ...

getCamelContext().createProducerTemplate().sendBody("seda:input","Hey"); 

тем не менее, если ваш код клиента не в той же виртуальной машины Java или не в состоянии получить ручку к тому же CamelContext, то ваши варианты использования JMS, REST, HTTP (или любой camel component, которые поддерживают удаленное клиентские интерфейсы) ... вместо или вокруг SEDA en dpoint.

Например, вы могли бы обернуть доступ к очереди SEDA с HTTP конечной точки (через camel-jetty), как это ...

from("jetty:http://localhost:9001/input").to("seda:input"); 
+0

Невозможно добавить camelContext в свой компонент bean. Я получаю «Недопустимое свойство« camelContext »класса bean. Если я отправляю тело в очередь SEDA, сообщение идет туда, но не к следующему элементу маршрута –

+0

Обновлен мой вопрос, основанный на вашем комментарии –

+1

Недопустимое свойство означает, что вы не определили геттер/сеттер в вашем классе bean. . –

1

Компонент SEDA на верблюде выдается как асинхронный внутренний канал. Это очень полезно, если вам нужно отделить обработку сообщений от нескольких потоков и добиться более эластичной реализации.

В вашем примере у вас есть конечная точка activemq. На концептуальной основе он будет делать почти тот же компонент SEDA, но с большим количеством причуд. Я предлагаю вам использовать activemq или другой протокол для клиентов, взаимодействующих с Camel.

Это означает, что если ваш клиент работает в одном и том же приложении Java, как и Camel, и ваш клиент может завладеть контекстом Camel (который, как правило, рекомендую в целом), вы можете использовать ProducerTemplates для отправки сообщений компонентам SEDA , Посмотрите на компонент VM, который почти такой же, как SEDA, но может использоваться в одной и той же виртуальной машине вместо одного и того же контекста Camel. How ProducerTemplate works.

+0

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

+1

camel-seda создает очередь SEDA для вас, когда вы определяете конечную точку (как описал Петтер). с точки зрения клиента, вам нужно использовать Camel ProducerTemplate (или другой маршрут) для передачи сообщений этой конечной точке, что-то вроде этого ... context.createProducerTemplate(). sendBody («seda: input», «myMessage»). –

+0

@boday Я обновил свой вопрос на основе вашего ввода, но все же я не могу подключиться к очереди SEDA. –

Смежные вопросы