0

I am using soap service configured using camel-cxf. The messages are sent into IBM MQ. I get the below exception from the JMS consumer application when it trys to put the response into the reply queue.

The below exception is seen only after upgrading to camel 3.0.0

However, I don't see this issue before the upgrade where I was using Camel version : 2.22.0 CXF version : 3.2.4 IBM MQ Version : 8.0.0.5

After the upgrade Camel version : 3.0.0 CXF version : 3.3.6 IBM MQ Version : 8.0.0.5

There is no change in the IBM MQ Server version remains the same at 8.0.0.5.

Also, When I checked for the specific error, I understand that this issue happened in IBM MQ versions below 7 and had a fix in version 7.5 Refer this : PublishJMS processor failing for writing message to IBM Websphere MQ

In my usecase, the request-reply flow works when I degrade the camel version as mentioned above.

Should I manually, add the specific JMS Message Headers to the camel exchange object as part of camel 3, or is that some other change that I am missing. Please advice

EXCEPTION STACK

[cxf.services.dummyServiceNamePortType.RESP_OUT(performLogging:76)] RESP_OUT
    Content-Type: text/xml
    Headers: {JMS_IBM_Format=MQSTR   , JMS_IBM_Character_Set=UTF-8, JMS_IBM_PutDate=20200401, JMSXDeliveryCount=1, JMS_IBM_MsgType=1, JMSXUserID=mqclient    , JMS_IBM_Encoding=273, JMS_IBM_PutTime=14472875, JMSMessageType=text, JMS_IBM_PutApplType=28, JMSXAppID=exe                         }
   
WARN  pool-3-thread-2 [apache.cxf.phase.PhaseInterceptorChain(doLog:475)] Interceptor for serviceName has thrown exception, unwinding now
java.lang.RuntimeException: JMSCC0051: The property 'JMS_IBM_MsgType' should be set using type 'java.lang.Integer', not 'java.lang.String'.
  at org.apache.cxf.transport.jms.util.JMSUtil.convertJmsException(JMSUtil.java:98) ~[cxf-rt-transports-jms-3.3.4.jar:3.3.4]
  at org.apache.cxf.transport.jms.BackChannelConduit.sendExchange(BackChannelConduit.java:123) ~[cxf-rt-transports-jms-3.3.4.jar:3.3.4]
  at org.apache.cxf.transport.jms.MessageStreamUtil$SendingWriter.close(MessageStreamUtil.java:66) ~[cxf-rt-transports-jms-3.3.4.jar:3.3.4]
  at java.io.FilterWriter.close(FilterWriter.java:104) ~[?:1.8.0_191]
  at org.apache.cxf.ext.logging.LoggingOutInterceptor$LogEventSendingWriter.close(LoggingOutInterceptor.java:152) ~[cxf-rt-features-logging-3.3.4.jar:3.3.4]
  at org.apache.cxf.transport.jms.MessageStreamUtil.closeStreams(MessageStreamUtil.java:89) ~[cxf-rt-transports-jms-3.3.4.jar:3.3.4]
  at org.apache.cxf.transport.jms.BackChannelConduit.close(BackChannelConduit.java:72) ~[cxf-rt-transports-jms-3.3.4.jar:3.3.4]
  at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63) ~[cxf-core-3.3.4.jar:3.3.4]
  at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) [cxf-core-3.3.4.jar:3.3.4]
  at org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:90) [cxf-core-3.3.4.jar:3.3.4]
  at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) [cxf-core-3.3.4.jar:3.3.4]
  at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) [cxf-core-3.3.4.jar:3.3.4]
  at org.apache.cxf.transport.jms.JMSDestination.onMessage(JMSDestination.java:254) [cxf-rt-transports-jms-3.3.4.jar:3.3.4]
  at org.apache.cxf.transport.jms.util.PollingMessageListenerContainer$Poller.run(PollingMessageListenerContainer.java:84) [cxf-rt-transports-jms-3.3.4.jar:3.3.4]
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_191]
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_191]
  at java.lang.Thread.run(Thread.java:748) [?:1.8.0_191]
Caused by: com.ibm.msg.client.jms.DetailedMessageFormatException: JMSCC0051: The property 'JMS_IBM_MsgType' should be set using type 'java.lang.Integer', not 'java.lang.String'.
  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_191]
  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_191]
  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_191]
  at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_191]
  at com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:319) ~[com.ibm.mq.allclient-9.1.4.0.jar:9.1.4.0 - p914-L191119]
  at com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices.java:226) ~[com.ibm.mq.allclient-9.1.4.0.jar:9.1.4.0 - p914-L191119]
  at com.ibm.msg.client.jms.internal.JmsErrorUtils.createException(JmsErrorUtils.java:126) ~[com.ibm.mq.allclient-9.1.4.0.jar:9.1.4.0 - p914-L191119]
  at com.ibm.msg.client.jms.internal.JmsMessageImpl.checkSettablePropertyName(JmsMessageImpl.java:2627) ~[com.ibm.mq.allclient-9.1.4.0.jar:9.1.4.0 - p914-L191119]
  at com.ibm.msg.client.jms.internal.JmsMessageImpl.setStringProperty(JmsMessageImpl.java:1998) ~[com.ibm.mq.allclient-9.1.4.0.jar:9.1.4.0 - p914-L191119]
  at com.ibm.jms.JMSMessage.setStringProperty(JMSMessage.java:1516) ~[com.ibm.mq.allclient-9.1.4.0.jar:9.1.4.0 - p914-L191119]
  at org.apache.cxf.transport.jms.JMSMessageHeadersType.writeProp(JMSMessageHeadersType.java:390) ~[cxf-rt-transports-jms-3.3.4.jar:3.3.4]
  at org.apache.cxf.transport.jms.JMSMessageHeadersType.writeTo(JMSMessageHeadersType.java:429) ~[cxf-rt-transports-jms-3.3.4.jar:3.3.4]
  at org.apache.cxf.transport.jms.JMSMessageUtils.asJMSMessage(JMSMessageUtils.java:266) ~[cxf-rt-transports-jms-3.3.4.jar:3.3.4]
  at org.apache.cxf.transport.jms.BackChannelConduit.send(BackChannelConduit.java:156) ~[cxf-rt-transports-jms-3.3.4.jar:3.3.4]
  at org.apache.cxf.transport.jms.BackChannelConduit.sendExchange(BackChannelConduit.java:121) ~[cxf-rt-transports-jms-3.3.4.jar:3.3.4]
  ... 15 more
2020-04-01 16:47:29.407+0200 WARN  pool-3-thread-2 [apache.cxf.phase.PhaseInterceptorChain(doLog:475)] Interceptor for serviceName has thrown exception, unwinding now
org.apache.cxf.binding.soap.SoapFault: Error writing to XMLStreamWriter.
  at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor$SoapOutEndingInterceptor.handleMessage(SoapOutInterceptor.java:318) ~[cxf-rt-bindings-soap-3.3.4.jar:3.3.4]
  at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor$SoapOutEndingInterceptor.handleMessage(SoapOutInterceptor.java:294) ~[cxf-rt-bindings-soap-3.3.4.jar:3.3.4]
  at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) ~[cxf-core-3.3.4.jar:3.3.4]
  at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:112) ~[cxf-core-3.3.4.jar:3.3.4]
  at org.apache.camel.component.cxf.CxfConsumer.lambda$createServer$0(CxfConsumer.java:83) ~[camel-cxf-3.0.0.jar:3.0.0]
  at org.apache.cxf.phase.PhaseInterceptorChain.wrapExceptionAsFault(PhaseInterceptorChain.java:374) [cxf-core-3.3.4.jar:3.3.4]
  at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:332) [cxf-core-3.3.4.jar:3.3.4]
  at org.apache.cxf.interceptor.OutgoingChainInterceptor.handleMessage(OutgoingChainInterceptor.java:90) [cxf-core-3.3.4.jar:3.3.4]
  at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) [cxf-core-3.3.4.jar:3.3.4]
  at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121) [cxf-core-3.3.4.jar:3.3.4]
  at org.apache.cxf.transport.jms.JMSDestination.onMessage(JMSDestination.java:254) [cxf-rt-transports-jms-3.3.4.jar:3.3.4]
  at org.apache.cxf.transport.jms.util.PollingMessageListenerContainer$Poller.run(PollingMessageListenerContainer.java:84) [cxf-rt-transports-jms-3.3.4.jar:3.3.4]
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_191]
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_191]
  at java.lang.Thread.run(Thread.java:748) [?:1.8.0_191]
Caused by: javax.xml.stream.XMLStreamException: No open start element, when trying to write end element
  at com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:1584) ~[woodstox-core-5.0.3.jar:5.0.3]
  at com.ctc.wstx.sw.BaseStreamWriter.reportNwfStructure(BaseStreamWriter.java:1613) ~[woodstox-core-5.0.3.jar:5.0.3]
  at com.ctc.wstx.sw.BaseNsStreamWriter.doWriteEndTag(BaseNsStreamWriter.java:664) ~[woodstox-core-5.0.3.jar:5.0.3]
  at com.ctc.wstx.sw.BaseNsStreamWriter.writeEndElement(BaseNsStreamWriter.java:291) ~[woodstox-core-5.0.3.jar:5.0.3]
  at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor$SoapOutEndingInterceptor.handleMessage(SoapOutInterceptor.java:304) ~[cxf-rt-bindings-soap-3.3.4.jar:3.3.4]
  ... 14 more 

srikant_mantha
  • 109
  • 1
  • 13
  • It seems you are using Apache CXF SOAP over JMS and that CXF is also upgraded and it may have changed its way so a header is set as a String type instead of an Integer which IBM MQ is thrown an exception about. I suggest to log this in the Apache CXF JIRA tracker as a bug/issue and get help from that team to fix/improve this in CXF – Claus Ibsen Apr 24 '20 at 05:08
  • Also try to upgrade to Camel 3.2.0 and its updated CXF version (not sure if its fixed there, but that helps to know if its still an issue in latest releases) – Claus Ibsen Apr 24 '20 at 05:09
  • Let me try that and will get back to you – srikant_mantha Apr 25 '20 at 08:43
  • I see difference in the output when I keep the below code as is from the earlier version of camel before 3 ```exchange.getOut().setBody(response)``` With this code, I don't see any issues at all, but from camel documentation, ```getOut()``` method is deprecated. Henceforth, I changed the above code to ```exchange.getMessage().setBody(response)``` then I see the above exception Is there a way to set the soap xml response in camel 3. Do I need to map some header exclusively ? – srikant_mantha Apr 30 '20 at 18:07
  • Okay you have not shown the code you do with setting the reply. But it smells like you carry over some data from the input. You can clear the headers or set a new empty message and then set the response body on that. – Claus Ibsen May 01 '20 at 08:25

0 Answers0