Загрузка службы при запуске ServiceMix 4.3, которая использует другую службу, используя ActiveMQ / Apache Camel - PullRequest
0 голосов
/ 14 декабря 2010

Мы пытаемся с помощью ServiceA вызвать ServiceB, как только пакет загружается во время запуска SericeMix. Service2, имеющий конечные точки activemq, нам нужно вызвать метод этой конкретной службы. Я попытался с помощью весеннего атрибута init-method в теге bean, который помогает автоматически вызывать метод в ServiceA в том методе, который я вызываю методом serviceB. Я получаю Исключение, как Нет Потребителя, доступного для конечной точки. Я предполагаю, что, как только Service1 запущен, он не получает экземпляр service2, который должен быть инициализирован с использованием конечной точки аннотации @Produce activemq. Те же сервисы работают нормально в других нормальных сценариях.

Исключение: Вызвано: org.apache.camel.CamelExchangeException: нет потребителей, доступных на конечной точке: конечная точка [direct: // ServiceB]. Exchange [сообщение: общедоступный BeanInvocation java.lang.String java.lang.Object.toString () со значением NULL]] в org.apache.camel.component.direct.DirectProducer.process (DirectProducer.java:46) в 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.

Спасибо Ravi

Ответы [ 3 ]

0 голосов
/ 17 декабря 2010

Мы попробовали вышеуказанный подход, но мы все еще получаем исключения, мы решили его, добавив прослушиватель к onCamelContextStarted () во время инициализации службы A.

Спасибо, Рави

0 голосов
/ 22 декабря 2010

Если вы получаете «нет доступных потребителей на конечной точке», это означает, что сообщения направляются на конечную точку, которая не была инициализирована. Я рекомендую разделить службы, используя очередь JMS между ними. Таким образом, serviceA может помещать сообщения в очередь (независимо от доступности serviceB), а serviceB может тогда выступать в качестве потребителя опроса для этой очереди, когда он будет готов.

0 голосов
/ 16 декабря 2010

Вы можете использовать seda вместо direct, поскольку он основан на очереди, и поэтому потребители могут приходить и уходить.

Также попробуйте использовать атрибут зависимости от пружин

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

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