I decided to go back to trying the DeliveryChannel in my bean component
rather than looking a servicemix client up directly from JNDI.  When I do
this, it appears getInMessage() from the newly created exchange, returns
null.  All the examples I see, call getInMessage() so I'm not sure what I'm
doing wrong.  If I swap the 2 lines back so that they are using the
ServicemixClient, I don't have a problem with the NormalizedMessage being
null.  Here are the 2 relevant code snippets and their output:

Using ServicemixClient from JNDI lookup:

Code -------------------

          if (client == null) {
            ClientFactory factory = (ClientFactory) new
InitialContext().lookup(ClientFactory.DEFAULT_JNDI_NAME);
            client = factory.createClient();
          }
          InOnly outExchange = client.createInOnlyExchange();
          NormalizedMessage inMessage = outExchange.getInMessage();
          System.out.println("In message is: " + inMessage);
          System.out.println("In xml is: " + xml);
          inMessage.setContent(new StringSource(xml));
          outExchange.setService(destinationQname);
          client.send(outExchange);
          System.out.println("Message sent to jms provider using client ");


Output ------------------
Received a message, sending to jms provider: <?xml version="1.0"
encoding="UTF-8"?><testMessage>0</testMessage>
INFO  - ComponentMBeanImpl             - Initializing component:
ID:192.168.1.4-11d5e52a421-0:0
INFO  - ComponentMBeanImpl             - Starting component:
ID:192.168.1.4-11d5e52a421-0:0
In message is:
[EMAIL PROTECTED]:
{}}
In xml is: <?xml version="1.0"
encoding="UTF-8"?><testMessage>0</testMessage>
Message sent to jms provider using client:
Received a message, sending to jms provider: <?xml version="1.0"
encoding="UTF-8"?><testMessage>1</testMessage>
In message is:
[EMAIL PROTECTED]:
{}}
In xml is: <?xml version="1.0"
encoding="UTF-8"?><testMessage>1</testMessage>
Message sent to jms provider using client


Using injected delivery channel:

Code -------------------

          MessageExchangeFactory exchangeFactory =
deliveryChannel.createExchangeFactory();
          InOnly outExchange = exchangeFactory.createInOnlyExchange();
          NormalizedMessage inMessage = outExchange.getInMessage();
          System.out.println("In message is: " + inMessage);
          System.out.println("In xml is: " + xml);
          inMessage.setContent(new StringSource(xml));
          outExchange.setService(destinationQname);
          deliveryChannel.send(outExchange);
          System.out.println("Message sent to jms provider using delivery
channel: ");

Output ------------------

Received a message, sending to jms provider: <?xml version="1.0"
encoding="UTF-8"?><testMessage>0</testMessage>
In message is: null
In xml is: <?xml version="1.0"
encoding="UTF-8"?><testMessage>0</testMessage>
[Fatal Error] :-1:-1: Premature end of file.
ERROR - BeanComponent                  - Error processing exchange InOut[
  id: ID:192.168.1.4-11d5e52a421-5:212
  status: Active
  role: provider
  service: {http://servicemix.apache.org/samples/bridge}testbean
  endpoint: test/bean
  in: Unable to display: org.xml.sax.SAXParseException: Premature end of
file.
]
javax.jbi.messaging.MessagingException: Error sending message to jms
provider
        at test.BeanImpl.onMessageExchange(BeanImpl.java:106)
        at
org.apache.servicemix.bean.BeanEndpoint.onProviderExchange(BeanEndpoint.java:226)
        at
org.apache.servicemix.bean.BeanEndpoint.process(BeanEndpoint.java:212)
        at
org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLifeCycle.java:600)
        at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(AsyncBaseLifeCycle.java:554)
        at
org.apache.servicemix.common.AsyncBaseLifeCycle.onMessageExchange(AsyncBaseLifeCycle.java:510)
        at
org.apache.servicemix.common.SyncLifeCycleWrapper.onMessageExchange(SyncLifeCycleWrapper.java:60)
        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBound(DeliveryChannelImpl.java:620)
        at
org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlow.java:172)
        at
org.apache.servicemix.jbi.nmr.flow.seda.SedaFlow.doRouting(SedaFlow.java:168)
        at
org.apache.servicemix.jbi.nmr.flow.seda.SedaQueue$1.run(SedaQueue.java:134)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
        at test.BeanImpl.onMessageExchange(BeanImpl.java:100)
        ... 13 more
[Fatal Error] :-1:-1: Premature end of file.
ERROR - JmsComponent                   - Error processing exchange InOut[
  id: ID:192.168.1.4-11d5e52a421-5:212
  status: Error
  role: consumer
  service: {http://servicemix.apache.org/samples/bridge}testbean
  endpoint: test/bean
  in: Unable to display: org.xml.sax.SAXParseException: Premature end of
file.
  error: javax.jbi.messaging.MessagingException: Error sending message to
jms provider
]
java.lang.UnsupportedOperationException: A destination must be specified.
        at
org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:195)
        at
org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:241)
        at
org.apache.servicemix.jms.multiplexing.MultiplexingConsumerProcessor.process(MultiplexingConsumerProcessor.ja
a:126)
        at
org.apache.servicemix.soap.SoapEndpoint.process(SoapEndpoint.java:367)
        at
org.apache.servicemix.common.AsyncBaseLifeCycle.doProcess(AsyncBaseLifeCycle.java:600)
        at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(AsyncBaseLifeCycle.java:571)
        at
org.apache.servicemix.common.AsyncBaseLifeCycle.onMessageExchange(AsyncBaseLifeCycle.java:510)
        at
org.apache.servicemix.common.SyncLifeCycleWrapper.onMessageExchange(SyncLifeCycleWrapper.java:60)
        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBound(DeliveryChannelImpl.java:620)
        at
org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlow.java:172)
        at
org.apache.servicemix.jbi.nmr.flow.seda.SedaFlow.doRouting(SedaFlow.java:168)
        at
org.apache.servicemix.jbi.nmr.flow.seda.SedaQueue$1.run(SedaQueue.java:134)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
        at java.lang.Thread.run(Thread.java:619)
ERROR - JmsComponent                   - Error setting exchange status to
ERROR
javax.jbi.messaging.MessagingException: illegal call to send / sendSync
        at
org.apache.servicemix.jbi.messaging.MessageExchangeImpl.handleSend(MessageExchangeImpl.java:614)
        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.doSend(DeliveryChannelImpl.java:385)
        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.send(DeliveryChannelImpl.java:431)
        at
org.apache.servicemix.common.AsyncBaseLifeCycle.onMessageExchange(AsyncBaseLifeCycle.java:525)
        at
org.apache.servicemix.common.SyncLifeCycleWrapper.onMessageExchange(SyncLifeCycleWrapper.java:60)
        at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBound(DeliveryChannelImpl.java:620)
        at
org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlow.java:172)
        at
org.apache.servicemix.jbi.nmr.flow.seda.SedaFlow.doRouting(SedaFlow.java:168)
        at
org.apache.servicemix.jbi.nmr.flow.seda.SedaQueue$1.run(SedaQueue.java:134)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
        at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
        at java.lang.Thread.run(Thread.java:619)
Received a message, sending to jms provider: <?xml version="1.0"
encoding="UTF-8"?><testMessage>1</testMessage>
In message is: null
In xml is: <?xml version="1.0"
encoding="UTF-8"?><testMessage>1</testMessage>
[Fatal Error] :-1:-1: Premature end of file.
ERROR - BeanComponent                  - Error processing exchange InOut[
  id: ID:192.168.1.4-11d5e52a421-5:213
  status: Active
  role: provider
...

Using ComponentContext from ServiceMixClient

Code ------------

if (client == null) {
            client = new ServiceMixClientFacade(componentContext);
          }

          InOnly outExchange = client.createInOnlyExchange();
          NormalizedMessage inMessage = outExchange.getInMessage();
          System.out.println("In message is: " + inMessage);
          System.out.println("In xml is: " + xml);
          inMessage.setContent(new StringSource(xml));
          outExchange.setService(destinationQname);
          client.send(outExchange);
          System.out.println("Message sent to jms provider using component
context: ");

Output --------------

Received a message, sending to jms provider: <?xml version="1.0"
encoding="UTF-8"?><testMessage>0</testMessage>
In message is:
[EMAIL PROTECTED]:
{}}
In xml is: <?xml version="1.0"
encoding="UTF-8"?><testMessage>0</testMessage>
Message sent to jms provider using delivery channel:
Exchange was marked done, not doing anything else.
Received a message, sending to jms provider: <?xml version="1.0"
encoding="UTF-8"?><testMessage>1</testMessage>
In message is:
[EMAIL PROTECTED]:
{}}
In xml is: <?xml version="1.0"
encoding="UTF-8"?><testMessage>1</testMessage>
Message sent to jms provider using delivery channel:
Exchange was marked done, not doing anything else.




Why doesn't the DeliveryChannel used by itself work?  Should I always just
do it the third way?

Thanks,
Ryan

Reply via email to