【问题标题】:How to expose Proxy SOAP webservice in Mule with JMS queue如何使用 JMS 队列在 Mule 中公开代理 SOAP Web 服务
【发布时间】:2015-07-21 14:20:00
【问题描述】:

我需要托管 SOAP Web 服务并将代理 Web 服务托管到该主要 Web 服务... 所以我有以下内容:-

  1. 公开以执行 CRUD 操作的 SOAP Web 服务。
  2. 该主要 Web 服务的代理 Web 服务

现在我已经创建了公开的 SOAP Web 服务并执行 CRUD 操作,它工作正常。现在问题出在代理 Web 服务上。以下是我的代理 Web 服务配置:-

<flow name="ProxyFlow" doc:name="ProxyFlow">
 <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8086" path="proxy/mainData" doc:name="HTTP" />
<cxf:proxy-service port="MainDataPort" namespace="http://services.test.com/schema/MainData/V1"  service="MainDataService"  payload="body" wsdlLocation="MainData.wsdl" doc:name="SOAP"/>
<mulexml:dom-to-xml-transformer doc:name="DOM to XML"/> 
<jms:outbound-endpoint queue="ProxyQueue" connector-ref="Active_MQ" doc:name="JMS" exchange-pattern="request-response"/>
</flow>

<flow name="ClientProxy" doc:name="ClientProxy">
<jms:inbound-endpoint connector-ref="Active_MQ" address="jms://tcp:ProxyQueue" doc:name="JMS" exchange-pattern="request-response" disableTemporaryReplyToDestinations="true" responseTimeout="90000"/>
<byte-array-to-string-transformer doc:name="Byte Array to String"/>  
<cxf:proxy-client payload="body" doc:name="SOAP" />
<http:outbound-endpoint exchange-pattern="request-response"   host="localhost" port="8082" path="mainData" method="POST" doc:name="HTTP" />
</flow>

现在您可以看到代理 Web 服务正在使用 JMS 队列..当我从 SOAPUI 触发代理 Web 服务时..我得到以下异常:-

INFO  2014-09-11 21:16:46,475 [ActiveMQ Session Task-1] org.mule.transport.service.DefaultTransportServiceDescriptor: Loading default outbound transformer: org.mule.transport.jms.transformers.ObjectToJMSMessage
ERROR 2014-09-11 21:16:46,483 [ActiveMQ Session Task-1] org.mule.exception.DefaultMessagingExceptionStrategy: 
********************************************************************************
Message               : Source was not of a supported type. Valid types are Message, String, Map, InputStream, List, byte[], Serializable or OutputHandler, but was DepthXMLStreamReader (javax.jms.JMSException)
Code                  : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. Source was not of a supported type. Valid types are Message, String, Map, InputStream, List, byte[], Serializable or OutputHandler, but was DepthXMLStreamReader(JMS Code: null) (javax.jms.JMSException)
  org.mule.transport.jms.JmsMessageUtils:144 (http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/jms/JMSException.html)
2. Source was not of a supported type. Valid types are Message, String, Map, InputStream, List, byte[], Serializable or OutputHandler, but was DepthXMLStreamReader (javax.jms.JMSException) (org.mule.api.transformer.TransformerException)
  org.mule.transport.jms.transformers.AbstractJmsTransformer:79 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transformer/TransformerException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
javax.jms.JMSException: Source was not of a supported type. Valid types are Message, String, Map, InputStream, List, byte[], Serializable or OutputHandler, but was DepthXMLStreamReader
    at org.mule.transport.jms.JmsMessageUtils.toMessage(JmsMessageUtils.java:144)
    at org.mule.transport.jms.transformers.AbstractJmsTransformer.transformToMessage(AbstractJmsTransformer.java:66)
    at org.mule.transport.jms.transformers.ObjectToJMSMessage.transformMessage(ObjectToJMSMessage.java:54)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************

ERROR 2014-09-11 21:16:47,522 [ActiveMQ Session Task-2] org.mule.exception.DefaultMessagingExceptionStrategy: 
********************************************************************************
Message               : "Message with id "ID:ANIRBAN-PC-49972-1410450386406-1:1:14:1:1" has been redelivered 1 times on endpoint "jms://tcp:ProxyQueue", which exceeds the maxRedelivery setting of 0 on the connector "Active_MQ". Message payload is of type: ActiveMQTextMessage
Code                  : MULE_ERROR--2
--------------------------------------------------------------------------------
Exception stack is:
1. "Message with id "ID:ANIRBAN-PC-49972-1410450386406-1:1:14:1:1" has been redelivered 1 times on endpoint "jms://tcp:ProxyQueue", which exceeds the maxRedelivery setting of 0 on the connector "Active_MQ". Message payload is of type: ActiveMQTextMessage (org.mule.transport.jms.redelivery.MessageRedeliveredException)
  org.mule.transport.jms.redelivery.JmsXRedeliveryHandler:81 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/transport/jms/redelivery/MessageRedeliveredException.html)
--------------------------------------------------------------------------------
Root Exception stack trace:
org.mule.transport.jms.redelivery.MessageRedeliveredException: "Message with id "ID:ANIRBAN-PC-49972-1410450386406-1:1:14:1:1" has been redelivered 1 times on endpoint "jms://tcp:ProxyQueue", which exceeds the maxRedelivery setting of 0 on the connector "Active_MQ". Message payload is of type: ActiveMQTextMessage
    at org.mule.transport.jms.redelivery.JmsXRedeliveryHandler.handleRedelivery(JmsXRedeliveryHandler.java:81)
    at org.mule.transport.jms.MultiConsumerJmsMessageReceiver$JmsWorker.preProcessMessage(MultiConsumerJmsMessageReceiver.java:512)
    at org.mule.transport.AbstractReceiverWorker$1$1.process(AbstractReceiverWorker.java:117)
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
********************************************************************************

WARN  2014-09-11 21:16:56,369 [[Dummysimpleclientwebservice].connector.http.mule.default.receiver.03] org.apache.cxf.phase.PhaseInterceptorChain: Interceptor for {http://services.vertu.com/schema/MainData/V1}MainDataService has thrown exception, unwinding now
java.lang.NullPointerException
    at org.apache.cxf.databinding.stax.StaxDataBinding$XMLStreamDataWriter.write(StaxDataBinding.java:147)
    at org.apache.cxf.databinding.stax.StaxDataBinding$XMLStreamDataWriter.write(StaxDataBinding.java:135)
    at org.apache.cxf.databinding.stax.StaxDataBinding$XMLStreamDataWriter.write(StaxDataBinding.java:131)
    at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:119)
    at org.apache.cxf.interceptor.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
    at org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:232)
    at org.mule.module.cxf.CxfInboundMessageProcessor$1.write(CxfInboundMessageProcessor.java:426)
    at org.mule.transport.http.HttpServerConnection.writeResponse(HttpServerConnection.java:353)
    at org.mule.transport.http.HttpMessageProcessTemplate.sendResponseToClient(HttpMessageProcessTemplate.java:137)
    at org.mule.execution.FlowProcessingPhase.sendResponseIfNeccessary(FlowProcessingPhase.java:153)
    at org.mule.execution.FlowProcessingPhase.access$000(FlowProcessingPhase.java:29)
    at org.mule.execution.FlowProcessingPhase$1$1.process(FlowProcessingPhase.java:78)
    at org.mule.execution.FlowProcessingPhase$1$1.process(FlowProcessingPhase.java:63)
    at org.mule.execution.ExecuteCallbackInterceptor.execute(ExecuteCallbackInterceptor.java:16)
    at org.mule.execution.HandleExceptionInterceptor.execute(HandleExceptionInterceptor.java:30)
    at org.mule.execution.HandleExceptionInterceptor.execute(HandleExceptionInterceptor.java:14)
    at org.mule.execution.BeginAndResolveTransactionInterceptor.execute(BeginAndResolveTransactionInterceptor.java:54)
    at org.mule.execution.ResolvePreviousTransactionInterceptor.execute(ResolvePreviousTransactionInterceptor.java:44)
    at org.mule.execution.SuspendXaTransactionInterceptor.execute(SuspendXaTransactionInterceptor.java:50)
    at org.mule.execution.ValidateTransactionalStateInterceptor.execute(ValidateTransactionalStateInterceptor.java:40)
    at org.mule.execution.IsolateCurrentTransactionInterceptor.execute(IsolateCurrentTransactionInterceptor.java:41)
    at org.mule.execution.ExternalTransactionInterceptor.execute(ExternalTransactionInterceptor.java:48)
    at org.mule.execution.RethrowExceptionInterceptor.execute(RethrowExceptionInterceptor.java:28)
    at org.mule.execution.RethrowExceptionInterceptor.execute(RethrowExceptionInterceptor.java:13)
    at org.mule.execution.TransactionalErrorHandlingExecutionTemplate.execute(TransactionalErrorHandlingExecutionTemplate.java:109)
    at org.mule.execution.FlowProcessingPhase$1.run(FlowProcessingPhase.java:62)
    at org.mule.transport.TrackingWorkManager$TrackeableWork.run(TrackingWorkManager.java:267)
    at org.mule.work.WorkerContext.run(WorkerContext.java:286)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

现在我可以发现主要的 web 服务是在内部调用的,并且数据是在数据库中创建的。但我想它无法将响应转换回代理客户端 ..任何建议 ..

【问题讨论】:

    标签: mule mule-studio


    【解决方案1】:

    尝试通过以下方式使用代理客户端。

    <http:outbound-endpoint exchange-pattern="request-response"   host="localhost" port="8082" path="mainData" method="POST" doc:name="HTTP" >
       <cxf:proxy-client payload="body" doc:name="SOAP" />        
    </http:outbound-endpoint>
    <logger level="INFO" message="#[message.payloadAs(java.lang.String)]" />
    

    HTTP 出站正在以 DepthXMLStreamReader 格式重新发送响应。 Proxy-client 的上述格式应该会有所帮助。记录器将从 StreamReader 读取响应,因此它是可序列化的格式。

    希望这会有所帮助。

    【讨论】:

    • 即使在添加了 Logger 之后?您是否尝试将 Object 添加到 String 或 ByteArray 到 String 转换器?
    • 是的..现在它在添加记录器后工作了..它背后的原因是什么?? ..你能告诉我它在响应端期待字符串格式的确切原因吗???
    • 来自 HTTP 出站的响应是一个流。当对有效载荷(以流的形式)执行另一个操作时。流被完全读取并且可作为适当的对象使用。在前一种情况下,当您将响应从 HTTP 发布到 JMS 时,响应仍然是 JMS 无法接收的流。
    • 如果答案对您有用,请点赞。这鼓励用户提供更多帮助。
    【解决方案2】:

    我意识到Http outbound之后的payload是流,所以需要转成String,否则会报异常。

    所以,对我有用的解决方案是:-

    <logger level="INFO" message="#[message.payloadAs(java.lang.String)]" />
    

    另外,我意识到把&lt;byte-array-to-string-transformer&gt; 也可以工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 2020-07-27
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多