2 Replies Latest reply on Jun 21, 2012 1:38 PM by edevera

    Forge + Camel Route + JMS Binding results into NullPointerException

    edevera

      When using Forge in order to build my project in order to create a camel service, a bean service and then a camel jms binding to the first service I get the following switchyard xml:

       

      <?xml version="1.0" encoding="UTF-8"?>

      <switchyard xmlns="urn:switchyard-config:switchyard:1.0">

          <composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"

                     name="TestComposite"

                     targetNamespace="urn:switchyard:application:1.0">

              <service name="MyService" promote="MyService">

                  <binding.camel xmlns="urn:switchyard-component-camel:config:1.0" configURI="jms://MyQueue?connectionFactory=#ConnectionFactory"/>

              </service>

              <component name="MyServiceBuilder">

                  <implementation.camel xmlns="urn:switchyard-component-camel:config:1.0">

                      <java class="org.switchyard.examples.forge.MyServiceBuilder"/>

                  </implementation.camel>

                  <service name="MyService">

                      <interface.java interface="org.switchyard.examples.forge.MyService"/>

                  </service>

                  <reference name="OrderService">

                      <interface.java interface="org.switchyard.examples.forge.OrderService"/>

                  </reference>

              </component>

          </composite>

      </switchyard>

       

      If I try to run a JUnit test with the Switchyard runner (or by directly deploying it in JBoss Switchyard) I get the following NullpointerException:

       

      18:56:32,077 ERROR [processor.DefaultErrorHandler] Failed delivery for (MessageId: ID:0d5f632f-bbc2-11e1-bfbe-e0f847371cc8 on ExchangeId: ID-macbookpro-54457-1340297791030-1-1). Exhausted after delivery attempt: 1 caught: java.lang.NullPointerException

      java.lang.NullPointerException

                at org.switchyard.component.camel.SwitchYardProducer.lookupOperationNameFor(SwitchYardProducer.java:119)

                at org.switchyard.component.camel.SwitchYardProducer.createSwitchyardExchange(SwitchYardProducer.java:102)

                at org.switchyard.component.camel.SwitchYardProducer.process(SwitchYardProducer.java:81)

                at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)

                at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)

                at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:115)

                at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:285)

                at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:110)

                at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)

                at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)

                at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)

                at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:71)

                at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)

                at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)

                at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)

                at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:91)

                at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)

                at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:333)

                at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:223)

                at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45)

                at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)

                at org.apache.camel.processor.interceptor.DefaultChannel.process(DefaultChannel.java:304)

                at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45)

                at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)

                at org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:150)

                at org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:117)

                at org.apache.camel.processor.RouteInflightRepositoryProcessor.processNext(RouteInflightRepositoryProcessor.java:50)

                at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)

                at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)

                at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)

                at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)

                at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:71)

                at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:99)

                at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:86)

                at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:104)

                at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:560)

                at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:498)

                at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:467)

                at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325)

                at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263)

                at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1058)

                at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1050)

                at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947)

                at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

                at java.lang.Thread.run(Thread.java:680)

      18:56:32,089 WARN  [jms.EndpointMessageListener] Execution of JMS message listener failed. Caused by: [org.apache.camel.RuntimeCamelException - java.lang.NullPointerException]

      org.apache.camel.RuntimeCamelException: java.lang.NullPointerException

                at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1221)

                at org.apache.camel.component.jms.EndpointMessageListener$EndpointMessageListenerAsyncCallback.done(EndpointMessageListener.java:187)

                at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:108)

                at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:560)

                at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:498)

                at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:467)

                at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325)

                at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263)

                at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1058)

                at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1050)

                at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947)

                at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

                at java.lang.Thread.run(Thread.java:680)

      Caused by: java.lang.NullPointerException

                at org.switchyard.component.camel.SwitchYardProducer.lookupOperationNameFor(SwitchYardProducer.java:119)

                at org.switchyard.component.camel.SwitchYardProducer.createSwitchyardExchange(SwitchYardProducer.java:102)

                at org.switchyard.component.camel.SwitchYardProducer.process(SwitchYardProducer.java:81)

                at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)

                at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)

                at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:115)

                at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:285)

                at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:110)

                at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)

                at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)

                at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)

                at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:71)

                at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)

                at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)

                at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)

                at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:91)

                at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)

                at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:333)

                at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:223)

                at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45)

                at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)

                at org.apache.camel.processor.interceptor.DefaultChannel.process(DefaultChannel.java:304)

                at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45)

                at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)

                at org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:150)

                at org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:117)

                at org.apache.camel.processor.RouteInflightRepositoryProcessor.processNext(RouteInflightRepositoryProcessor.java:50)

                at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)

                at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)

                at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)

                at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)

                at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:71)

                at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:99)

                at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:86)

                at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:104)

                ... 11 more

       

      If I then add the following element to the switchyard.xml file, then everything works:

       

      <?xml version="1.0" encoding="UTF-8"?>

      <switchyard xmlns="urn:switchyard-config:switchyard:1.0">

          <composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"

                     name="TestComposite"

                     targetNamespace="urn:switchyard:application:1.0">

              <service name="MyService" promote="MyService">

                  <interface.java interface="org.switchyard.examples.forge.MyService" />

                  <binding.camel xmlns="urn:switchyard-component-camel:config:1.0" configURI="jms://MyQueue?connectionFactory=#ConnectionFactory"/>

              </service>

              <component name="MyServiceBuilder">

                  <implementation.camel xmlns="urn:switchyard-component-camel:config:1.0">

                      <java class="org.switchyard.examples.forge.MyServiceBuilder"/>

                  </implementation.camel>

                  <service name="MyService">

                      <interface.java interface="org.switchyard.examples.forge.MyService"/>

                  </service>

                  <reference name="OrderService">

                      <interface.java interface="org.switchyard.examples.forge.OrderService"/>

                  </reference>

              </component>

          </composite>

      </switchyard>

       

      I do find it a bit strange that I have to define the same interface twice for the same service. I believe that if instead of a Camel Service bound to a JMS Camel binding I use a Bean Service, I don't need to additionally add the interface.java element in the top level promoted service element.

       

      Would this be considered a forge bug, a switchyard plugin bug or a wrong use from my side to the tools?

        • 1. Re: Forge + Camel Route + JMS Binding results into NullPointerException
          kcbabo

          It's a bug in our SwitchYard Forge plugin most likely.  I thought this was fixed, but the promotion of your component service is not including the full component-name/service-name string.  This is likely causing the interface lookup to fail at runtime when it's inherited, forcing you to explicitly declare the interface on the composite-level service.  If I'm right, this should work:

           

          <composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
                         name="TestComposite"
                         targetNamespace="urn:switchyard:application:1.0">
                  <service name="MyService" promote="MyServiceBuilder/MyService">
          

           

          You should not have to declare the interface twice.

           

          cheers,

          keith

          • 2. Re: Forge + Camel Route + JMS Binding results into NullPointerException
            edevera

            Worked like a charm. I am inclined to think that it is a forge plugin problem as well. Thanks for the help!