将springbean传递给Camel组件

将springbean传递给Camel组件,spring,apache-camel,Spring,Apache Camel,我有一个类型为FooComponent的自定义组件,它通过以下行添加到路由中: from("foo://bar?args=values&etc") .bean(DownstreamComponent.class) ... FooComponent创建一个端点和消费者(类型为foocummer),该端点和消费者依次发出消息,这些消息到达下游组件和管道的其余部分 为了进行监视,我需要FooComponent使用者调用一个非Camel对象上的方法,我正在创建一

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

from("foo://bar?args=values&etc")
        .bean(DownstreamComponent.class)
        ...
FooComponent
创建一个端点和消费者(类型为
foocummer
),该端点和消费者依次发出消息,这些消息到达
下游组件和管道的其余部分

为了进行监视,我需要
FooComponent
使用者调用一个非Camel对象上的方法,我正在创建一个springbean。Camel管道对性能非常敏感,因此我无法将
FooComponent
分成两半,并将监视器调用作为Camel组件插入它们之间(我的首选解决方案,因为
FooComponent
不必真正了解监视器)。我不愿意将方法调用转换为驼峰消息,稍后将由管道中的监控组件拾取,因为管道过滤稍后会变得复杂,我不想过度干预

食品消费者
的某个地方,我有:

// in the class
@Autowired
Monitor monitor;

// inside the consumer's run method
monitor.noticeSomething();
问题是,
monitor
永远不会设置为在应用程序的其余部分中创建的监视器bean。据我所知,这是因为Spring看不到
FooConsumer
本身——这种类型的对象通常在
FooComponent
中创建

那么,如何获取
FooComponent
以找到它需要使用的
Monitor
实例呢

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

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

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

<bean id="foo" class="my.FooComponent">
    <property name="monitor" ref="monitorBean"/>
</bean>
如果在每个端点的基础上更改监视bean,则可以使用Camel的漂亮的
#
语法来定位具有该id的bean,并将其注入端点属性

foo:something?monitor=#monitorBean
然后在你的
foodconsumer
中使用它,你只需说:

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

最简单的方法是在
FooComponent
类上创建一个
Monitor
属性,并像其他bean一样连接它

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

<bean id="foo" class="my.FooComponent">
    <property name="monitor" ref="monitorBean"/>
</bean>
如果在每个端点的基础上更改监视bean,则可以使用Camel的漂亮的
#
语法来定位具有该id的bean,并将其注入端点属性

foo:something?monitor=#monitorBean
然后在你的
foodconsumer
中使用它,你只需说:

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

如果您有Monitor的单例实例,您应该能够在FooComponent类中@Autowire它。当创建FooComponent时,Camel将允许Spring依赖项注入


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

如果您有监视器的单例实例,您应该能够在FooComponent类中@Autowire它。当创建FooComponent时,Camel将允许Spring依赖项注入


然后,当您从组件创建端点/使用者时,可以传递monitor实例。

有趣的是,我们实际上没有使用XML配置。Java中有类似的工具吗?是的,只需直接在FooComponent上设置Monitor实例。谢谢Jake,我没有尝试过它,但它可能是自动连接的一个很好的替代方法。很有趣,但我们实际上没有使用XML配置。Java中是否有类似的工具?是的,只需直接在FooComponent上设置Monitor实例。谢谢Jake,我没有尝试过它,但它可能是自动布线的一个很好的替代方法。