将Spring bean传递给Camel组件

时间:2013-08-14 06:01:52

标签: spring apache-camel

我有一个FooComponent类型的自定义组件,它通过以下行添加到路径中:

from("foo://bar?args=values&etc")
        .bean(DownstreamComponent.class)
        ...

FooComponent创建一个端点和消费者(类型为FooConsumer),后者又会发送到DownstreamComponent和其他管道的消息。

对于监视,我需要FooComponent使用者来调用非Camel对象的方法,我将其创建为Spring bean。 Camel管道对性能非常敏感,所以我无法将FooComponent分成两半,并将监视器调用作为Camel组件插入它们之间(我的首选解决方案,因为FooComponent不应该真的有了解监视器)。而且我不愿意将方法调用转换为稍后在管道中由监视组件拾取的Camel消息,因为管道过滤在以后变得复杂并且我不想过多地干涉它。 / p>

FooConsumer内的某处,我有:

// in the class
@Autowired
Monitor monitor;

// inside the consumer's run method
monitor.noticeSomething();

问题是monitor永远不会被设置为在应用程序的其余部分中创建的Monitor bean。据我了解,这是因为FooConsumer本身对Spring不可见 - 该类型的对象通常在FooComponent内创建。

那么,我如何让FooComponent找到它需要使用的Monitor实例呢?

  • 我可以在创建路线时传递它吗?这似乎很棘手,因为定义是一个虚假的URL "foo://bar?args=values&etc";我还没有找到如何以这种方式传递Java对象。
  • 我可以让Spring在@Autowired内找到FooConsumer注释并以某种方式注入监控对象吗?

2 个答案:

答案 0 :(得分:4)

最简单的方法是在Monitor类上创建一个FooComponent属性,并像任何其他bean一样将其连接起来。

<bean id="monitorBean" class="my.Monitor"/>

<bean id="foo" class="my.FooComponent">
    <property name="monitor" ref="monitorBean"/>
</bean>

然后在FooConsumer中,当您需要抓住显示器时,请致电:

Monitor monitor = ((FooComponent) getEndpoint().getComponent()).getMonitor();

如果您基于每个端点更改监视bean,则可以使用Camel的漂亮#语法来定位具有该id的bean,并将其注入Endpoint属性。

foo:something?monitor=#monitorBean

然后在你的FooConsumer中使用它,你只需说:

Monitor monitor = ((FooEndpoint) getEndpoint()).getMonitor();

答案 1 :(得分:4)

如果你有一个Monitor的单例实例,你应该能够在FooComponent类中@Autowire它。因为Camel会在创建FooComponent时让Spring依赖注入。

然后,您可以在从组件创建端点/使用者时传递监视器实例。