Apache Camel 动态消费者

4
我已经创建了这些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");

最后,seda:printQueue没有消费者,在这种路由中发送消息似乎很正常。现在我想在路由被初始化之后引入一个新的消费者,在我看来,可以通过编程方式创建一个Spring bean,并使用@Consume(uri="seda:printQueue")注释让Camel拾取该bean,但是当我创建消费者时,Camel就会抱怨。

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

您有什么想法?

[更新]

我已经追溯到创建新消费者的类中出现的错误,我正在实例化PrintQueue类,然后使用AutowireCapableBeanFactory将其集成到Spring上下文中,执行factory.autowireBean(printQueueInstance),然后是factory.initializeBean(printQueueInstance, id),其中id是上面异常中出现的4965d710-b5c7-41cf-97e9-a42bdfcea894,所以我认为这可能是一些上下文范围的问题,也许我在主或Web Spring上下文中创建了此bean,无法被Camel上下文访问,这可能吗?


你是如何创建 @Consume bean 的?它是否进入了注册表?有没有理由在运行时创建它,而不是提前配置它? - bdeniker
1个回答

0

由于此路由通过使用“direct:”组件同步调用,因此似乎不需要“seda:”来异步调用另一个bean。在这种情况下,最简单的方法似乎是使用Camel的Java DSL中的bean方法调用bean。例如,在Camel bean文档中显示:

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");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接