2015-07-21 5 views
4

Я создал этот верблюд маршрутыApache Camel Динамические Потребители

from("direct:pageExtraction") 
      .bean(PageManager.class, "setProperties(*, ${headers})") 
      .filter().method(PageManager.class, "exists").to("seda:pagePostProcessing").end() 
      .to("seda:pageImposition"); 

      from("seda:pagePostProcessing") 
      .bean(PageManager.class, "extractThumbnail(*, ${headers})") 
      .bean(PageManager.class, "extractCMYKSeparation(*, ${headers})") 
      .bean(PageManager.class, "persist(*, ${headers})") 
      .bean(PageManager.class, "cleanUp(${headers})") 
      .to("seda:pageImposition"); 

      from("seda:pageImposition") 
      .bean(PageManager.class, "extractImposition(*, ${headers})") 
      .to("seda:printQueue"); 

В конце концов, Седа: PrintQueue не имеет потребителей, отправив сообщение на маршруте, как это, видимо, работает отлично. Теперь я хочу ввести нового потребителя после, маршруты были инициализированы, я подумал, что можно будет создать компонент Spring bean программно и позволить Camel забрать bean-компонент, используя аннотацию @Consume(uri="seda:printQueue"), но как только я создаю потребитель Camel жалобы

org.apache.camel.RuntimeCamelException: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named '4965d710-b5c7-41cf-97e9-a42bdfcea894' is defined] 

Любые мысли?

[UPDATE]

Я проследил ошибку в класс, где этот новый потребитель создан, я инстанцирование PrintQueue класса, а затем интегрировать его в контекст Spring с использованием AutowireCapableBeanFactory делает factory.autowireBean(printQueueInstance) а затем factory.initializeBean(printQueueInstance, id), где id - это 4965d710-b5c7-41cf-97e9-a42bdfcea894, который появляется в исключении выше, поэтому я думаю, что это должна быть какая-то проблема контекста, может быть, я создаю этот компонент в основном или веб-контексте Spring Spring, и он не может быть доступен в контексте Верблюда, возможно ли это?

+0

Как вы создание '@ Consume'-Инг боб? Он входит в реестр? Есть ли причина создавать его во время выполнения, а не настраивать его заранее? – bdeniker

ответ

0

Поскольку этот маршрут вызывается синхронно с использованием компонента «direct:», для асинхронного вызова другого компонента не требуется «seda:». В этой ситуации было бы проще всего вызывать bean-компонент с компонентами Camel's bean для Java DSL. В качестве примера, показанного в документации Camel боба на:

http://camel.apache.org/bean.html

Я бы просто сделать:

// Send message to the bean endpoint 
// and invoke given method. 
from("direct:start") 
    // do other stuff in your route 
    .beanRef("beanName", "methodName"); 
Смежные вопросы