0

SericeMix の起動中にバンドルがロードされるとすぐに、ServiceA が ServiceB を呼び出すことを試みています。Service2 には activemq エンドポイントがあり、その特定のサービスのメソッドを呼び出す必要があります。私はそのメソッドで ServiceA のメソッドを自動トリガーするのに役立つ bean タグの spring init-method 属性を試しました。私は serviceB のメソッドを呼び出しています。エンドポイントで No Consumer のような例外が発生しています。Service1 が起動するとすぐに、@Produce アノテーションの activemq エンドポイントを使用して初期化する必要がある service2 のインスタンスを取得していないと仮定します。他の通常のシナリオでは、同じサービスが正常に機能します。

例外: 原因: org.apache.camel.CamelExchangeException: エンドポイントで使用可能なコンシューマーがありません: Endpoint[direct://ServiceB]。Exchange[Message: BeanInvocation public java.lang.String java.lang.Object.toString() with null]] at 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 の起動中に、サービスを自動的にロードする (他のサービスを消費する) ことができます。

4

3 に答える 3

1

キューベースであるため、直接の代わりにsedaを使用できるため、消費者は行き来できます。

また、スプリング依存属性を使用してみてください

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

<osgi:camelContext id="myCamel" ...>
于 2010-12-16T16:39:57.833 に答える
0

上記のアプローチを試しましたが、まだ例外が発生しているため、serviceAの初期化中にonCamelContextStarted()にリスナーを追加することで解決しました。

ありがとうラヴィ

于 2010-12-17T14:18:00.217 に答える
0

「エンドポイントで使用可能なコンシューマーがありません」というメッセージが表示される場合は、初期化されていないエンドポイントにメッセージがルーティングされていることを意味します。JMS キューを使用してサービスを分離することをお勧めします。そうすれば、serviceA は (serviceB の可用性に関係なく) キューにメッセージを入れることができ、serviceB は準備ができたときにそのキューに対するポーリング コンシューマーとして機能できます。

于 2010-12-21T21:15:37.337 に答える