This is an expected behavior specified by the JBI specification when
using the DeliveryChannel directly.
The servicemix client has a slightly different behavior and pre-create
the in message for you.
So when using the delivery channel, you need to do the following:
InOnly outExchange = client.createInOnlyExchange();
NormalizedMessage inMessage = outExchange.createMessage();
outExchange.setInMessage(inMessage);
...
On Sun, Nov 2, 2008 at 7:28 PM, Ryan Moquin <[EMAIL PROTECTED]> wrote:
> 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
>
--
Cheers,
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
Open Source SOA
http://fusesource.com