Проблема с публикацией заголовков IBM MQ JMS после перехода на Camel 3

Я использую сервис мыла, настроенный с помощью camel-cxf. Сообщения отправляются в IBM MQ. Я получаю приведенное ниже исключение из пользовательского приложения JMS, когда оно пытается поместить ответ в очередь ответов.

Приведенное ниже исключение видно только после обновления до версии верблюда 3.0.0.

Однако я не вижу этой проблемы до обновления, когда я использовал версию Camel: 2.22.0 Версия CXF: 3.2.4 Версия IBM MQ: 8.0.0.5

После обновления Версия Camel: 3.0.0 Версия CXF: 3.3.6 Версия IBM MQ: 8.0.0.5

Нет никаких изменений в версии IBM MQ Server, которая остается прежней: 8.0.0.5.

Кроме того, когда я проверил конкретную ошибку, я понял, что эта проблема возникла в версиях IBM MQ ниже 7 и была исправлена ​​​​в версии 7.5. -processor-failing-for-writing-message-to-ibm-websphere-mq">Процессор PublishJMS не может записать сообщение в IBM Websphere MQ

В моем случае поток запросов-ответов работает, когда я ухудшаю верблюжью версию, как упоминалось выше.

Должен ли я вручную добавить определенные заголовки сообщений JMS в объект обмена верблюдами как часть верблюда 3, или это какое-то другое изменение, которое мне не хватает. Пожалуйста посоветуй

СТЕК ИСКЛЮЧЕНИЙ

[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 


person srikant_mantha    schedule 23.04.2020    source источник
comment
Похоже, вы используете Apache CXF SOAP поверх JMS, и что CXF также обновлен, и, возможно, он изменил свой способ, поэтому заголовок устанавливается как тип String вместо Integer, для которого IBM MQ генерирует исключение. Я предлагаю зарегистрировать это в трекере Apache CXF JIRA как ошибку/проблему и получить помощь от этой команды, чтобы исправить/улучшить это в CXF.   -  person Claus Ibsen    schedule 24.04.2020
comment
Также попробуйте обновиться до Camel 3.2.0 и его обновленной версии CXF (не уверен, исправлено ли это там, но это помогает узнать, сохраняется ли проблема в последних выпусках)   -  person Claus Ibsen    schedule 24.04.2020
comment
Позвольте мне попробовать это, и я свяжусь с вами   -  person srikant_mantha    schedule 25.04.2020
comment
Я вижу разницу в выводе, когда я сохраняю приведенный ниже код как в более ранней версии верблюда до 3 exchange.getOut().setBody(response) С этим кодом я вообще не вижу никаких проблем, но из документации верблюда метод getOut() устарел. Отныне я изменил приведенный выше код на exchange.getMessage().setBody(response), затем я вижу приведенное выше исключение. Есть ли способ установить ответ мыла xml в верблюде 3. Нужно ли мне отображать только какой-то заголовок?   -  person srikant_mantha    schedule 30.04.2020
comment
Хорошо, вы не показали код, который вы делаете с установкой ответа. Но пахнет так, как будто вы переносите какие-то данные из ввода. Вы можете очистить заголовки или установить новое пустое сообщение, а затем установить для него тело ответа.   -  person Claus Ibsen    schedule 01.05.2020