我们正在尝试使用ServiceA在SericeMix启动期间加载捆绑服务时立即调用ServiceB。具有activemq端点的Service2我们需要调用该特定服务的方法。我尝试使用bean标记中的spring init-method属性,这有助于在该方法中自动触发ServiceA中的方法,我正在调用serviceB的方法。我得到了Exception,比如No Consumer可用于端点。我假设一旦Service1启动,它就不会获得需要使用@Produce注释activemq端点初始化的service2实例。在其他正常情况下,相同的服务可以正常工作。
异常: 引起:org.apache.camel.CamelExchangeException:端点上没有可用的消费者:端点[direct:// ServiceB]。 Exchange [消息:BeanInvocation public java.lang.String java.lang.Object.toString()with null]] 在org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:46) at org.apache.camel.component.bean.CamelInvocationHandler.invoke(CamelInvocationHandler.java:64) ......还有35个
我复制粘贴代码块供您参考。
public class ServiceA{
@Produce(uri = "direct:ServiceB") //Active MQ endpoint
private ServiceB serviceB;
public void start()
{
Object obj = serviceB.getData(); }
. . .
.....
}
}
//Changes for method to auto trigger during spring bean load
<bean id="serviceA" class="com.test.serviceA" init-method="start">
</bean>
<osgi:camelContext id="ServiceA"
xmlns="http://camel.apache.org/schema/spring">
<template id="producerTemplate" />
<!-- These routes are outbound to other services -->
<route>
<from uri="ServiceB" />
<bean ref="enrichOutboundExchangeRef" />
<to uri="activemq:ServiceB?transferException=true" />
</route>
..............
</osgi:camelContext>
如果我需要达到这个要求,还是他们的另一种方式?我可以在servicemix启动期间自动加载服务(使用其他服务)。
由于 拉维
答案 0 :(得分:0)
您可以使用seda代替直接,因为它基于队列,因此消费者可以来去。
还尝试使用spring依赖属性
<bean id="serviceA" depends-on="myCamel" .../>
<osgi:camelContext id="myCamel" ...>
答案 1 :(得分:0)
我们尝试了上述方法,但我们仍然遇到异常,我们通过在serviceA初始化时向onCamelContextStarted()添加一个侦听器来解决它。
由于 拉维
答案 2 :(得分:0)
如果您收到“端点上没有可用的消费者”,则表示消息正被路由到尚未初始化的端点。我建议使用它们之间的JMS队列来解耦服务。这样,serviceA可以将消息放入队列中(独立于serviceB的可用性),然后serviceB可以在准备就绪时充当该队列的轮询消费者。