我们尝试使用ServiceA在SericeMix启动期间一加载捆绑包就调用ServiceB。Service2有了activemq端点,我们需要调用该特定服务的方法。我尝试使用bean标记中的spring init-method属性来帮助自动触发ServiceA中的方法,因为我正在调用serviceB的方法。我得到了异常,如没有消费者可用于端点。我假设一旦Service1启动,它就不会获得需要使用@Produce注解activemq端点进行初始化的service2实例。相同的服务在其他正常情况下工作得很好。
异常:由: org.apache.camel.CamelExchangeException: Endpointdirect://ServiceB上没有可用的使用者引起。在org.apache.camel.component.bean.CamelInvocationHandler.invoke(CamelInvocationHandler.java:64)的org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:46):ExchangeMessage: BeanInvocation public java.lang.String java.lang.Object.toString() with null] ... 35更多
我正在复制粘贴代码块供您参考。
public class ServiceA{
@Produce(uri = "direct:ServiceB") //Active MQ endpoint
private ServiceB serviceB;
public void start()
{
Object obj = serviceB.getData(); }
. . .
.....
}
}
**bundle-context.xml**
//Changes for method to auto trigger during spring bean load
<bean id="serviceA" class="com.test.serviceA" init-method="start">
</bean>
**bundle-context-camel.xml**
<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启动期间自动加载服务(使用其他服务)。
发布于 2010-12-17 00:39:58
你可以使用seda而不是direct,因为它是基于队列的,因此消费者可以来来去去。
还可以尝试使用springs depends on属性
<bean id="serviceA" depends-on="myCamel" .../>
<osgi:camelContext id="myCamel" ...>
发布于 2010-12-17 22:18:00
我们尝试了上面的方法,但我们仍然得到了异常,我们通过在serviceA初始化期间向onCamelContextStarted()添加一个侦听器解决了这个问题。
谢谢Ravi
发布于 2010-12-22 05:15:37
如果您得到“没有使用者在端点上可用”,这意味着消息正被路由到一个尚未初始化的端点。我建议在它们之间使用JMS队列来解耦服务。通过这种方式,serviceA可以将消息放入队列(独立于serviceB的可用性),并且serviceB可以在队列就绪时充当该队列的轮询使用者。
https://stackoverflow.com/questions/4440610
复制相似问题