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