在启动ServiceMix 4.3时加载服务,使用ActiveMQ / Apache Camel消耗其他服务

时间:2010-12-14 15:15:29

标签: apache-camel apache-servicemix fuse

我们正在尝试使用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();    }
        . . . 
        .....   
    }
  }

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启动期间自动加载服务(使用其他服务)。

由于 拉维

3 个答案:

答案 0 :(得分:0)

您可以使用seda代替直接,因为它基于队列,因此消费者可以来去。

还尝试使用spring依赖属性

<bean id="serviceA" depends-on="myCamel" .../>

<osgi:camelContext id="myCamel" ...>

答案 1 :(得分:0)

我们尝试了上述方法,但我们仍然遇到异常,我们通过在serviceA初始化时向onCamelContextStarted()添加一个侦听器来解决它。

由于 拉维

答案 2 :(得分:0)

如果您收到“端点上没有可用的消费者”,则表示消息正被路由到尚未初始化的端点。我建议使用它们之间的JMS队列来解耦服务。这样,serviceA可以将消息放入队列中(独立于serviceB的可用性),然后serviceB可以在准备就绪时充当该队列的轮询消费者。