我有一个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
实例呢?
"foo://bar?args=values&etc"
;我还没有找到如何以这种方式传递Java对象。@Autowired
内找到FooConsumer
注释并以某种方式注入监控对象吗?答案 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依赖注入。
然后,您可以在从组件创建端点/使用者时传递监视器实例。