2013-02-21 105 views
0

我正在使用下面指定的mule流来进行Web服务的简单请求。该请求成功,并与wireshark我看到什么看起来像一个适当的回应。对Web服务查询的文件处理响应的例外

我看到没有例外,直到我包括一个输出文件端点(为了捕获对文件的响应)。即使有这个例外(包含在底部),当我查看生成的输出文件时,我可以看到我的数据,尽管在很多情况下它是它的唯一部分数据。

什么导致此异常?

这是流量:

<flow name="TestAuditorClient_CheckerFlow1" doc:name="TestAuditorClient_CheckerFlow1"> 
    <quartz:inbound-endpoint jobName="gen" repeatInterval="10000" responseTimeout="10000" 
     doc:name="Quartz"> <quartz:event-generator-job /> </quartz:inbound-endpoint> 
    <component class="wsdl.Payload" doc:name="Java"/> 
    <cxf:jaxws-client operation="listTest" 
     clientClass="server.TestService_Service" port="TestServicePort" 
     wsdlLocation="http://192.168.66.7:8080/TestAuditorWebApp/TestService?wsdl" 
     enableMuleSoapHeaders="true" doc:name="SOAPY" /> 
    <outbound-endpoint 
     address="http://192.168.66.7:8080/TestAuditorWebApp/TestService" 
     doc:name="HTTP" mimeType="text/xml" /> 
    <logger message="Received HTTP Response #[payload]" level="INFO" 
     doc:name="Logger" /> 
    <file:outbound-endpoint path="C:\tmp" outputPattern="#[function:datestamp:dd-MM-yy]_#[function:systime].txt" 
     responseTimeout="10000" doc:name="Output File" /> 
</flow> 

这是例外:

INFO 2013-02-21 15:38:09,753 [[test_auditor_client4].TestAuditorClient_CheckerFlow1.stage1.02] org.mule.api.processor.LoggerMessageProcessor: soap payload:  [email protected] 
INFO 2013-02-21 15:38:09,769 [[test_auditor_client4].TestAuditorClient_CheckerFlow1.stage1.02] org.mule.transport.service.DefaultTransportServiceDescriptor: Loading default outbound transformer: org.mule.transport.http.transformers.ObjectToHttpClientMethodRequest 
INFO 2013-02-21 15:38:09,769 [[test_auditor_client4].TestAuditorClient_CheckerFlow1.stage1.02] org.mule.transport.service.DefaultTransportServiceDescriptor: Loading default response transformer: org.mule.transport.http.transformers.MuleMessageToHttpResponse 
INFO 2013-02-21 15:38:09,769 [[test_auditor_client4].TestAuditorClient_CheckerFlow1.stage1.02] org.mule.transport.service.DefaultTransportServiceDescriptor: Loading default outbound transformer: org.mule.transport.http.transformers.ObjectToHttpClientMethodRequest 
INFO 2013-02-21 15:38:09,769 [[test_auditor_client4].TestAuditorClient_CheckerFlow1.stage1.02] org.mule.lifecycle.AbstractLifecycleManager: Initialising: 'HTTP_HTTPS.dispatcher.479670620'. Object is: HttpClientMessageDispatcher 
INFO 2013-02-21 15:38:09,784 [[test_auditor_client4].TestAuditorClient_CheckerFlow1.stage1.02] org.mule.lifecycle.AbstractLifecycleManager: Starting: 'HTTP_HTTPS.dispatcher.479670620'. Object is: HttpClientMessageDispatcher 
INFO 2013-02-21 15:38:09,878 [[test_auditor_client4].TestAuditorClient_CheckerFlow1.stage1.02] org.mule.api.processor.LoggerMessageProcessor: Received HTTP Response [email protected] 
INFO 2013-02-21 15:38:09,878 [[test_auditor_client4].connector.file.mule.default.dispatcher.01] org.mule.lifecycle.AbstractLifecycleManager: Initialising: 'connector.file.mule.default.dispatcher.784931034'. Object is: FileMessageDispatcher 
INFO 2013-02-21 15:38:09,878 [[test_auditor_client4].connector.file.mule.default.dispatcher.01] org.mule.lifecycle.AbstractLifecycleManager: Starting: 'connector.file.mule.default.dispatcher.784931034'. Object is: FileMessageDispatcher 
INFO 2013-02-21 15:38:09,894 [[test_auditor_client4].connector.file.mule.default.dispatcher.01] org.mule.transport.file.FileConnector: Writing file to: C:\tmp\21-02-13_1361479089894.txt 
WARN 2013-02-21 15:38:09,894 [[test_auditor_client4].TestAuditorClient_CheckerFlow1.stage1.02] org.apache.cxf.phase.PhaseInterceptorChain: Interceptor for {http://server/}TestService#{http://server/}listTest has thrown exception, unwinding now 
java.lang.RuntimeException: Couldn't parse stream. 
    at org.apache.cxf.staxutils.StaxUtils.createXMLStreamReader(StaxUtils.java:1181) 
    at org.apache.cxf.interceptor.StaxInInterceptor.handleMessage(StaxInInterceptor.java:104) 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) 
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:799) 
    at org.mule.module.cxf.transport.MuleUniversalConduit.dispatchMuleMessage(MuleUniversalConduit.java:280) 
    at org.mule.module.cxf.transport.MuleUniversalConduit$2.handleMessage(MuleUniversalConduit.java:194) 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263) 
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:533) 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463) 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366) 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319) 
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:88) 
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134) 
    at $Proxy33.listTest(Unknown Source) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.mule.module.cxf.CxfOutboundMessageProcessor.doSendWithProxy(CxfOutboundMessageProcessor.java:187) 
    at org.mule.module.cxf.CxfOutboundMessageProcessor.process(CxfOutboundMessageProcessor.java:129) 
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27) 
    at org.mule.execution.MessageProcessorNotificationExecutionInterceptor.execute(MessageProcessorNotificationExecutionInterceptor.java:43) 
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:43) 
    at org.mule.processor.chain.DefaultMessageProcessorChain.doProcess(DefaultMessageProcessorChain.java:93) 
    at org.mule.processor.chain.AbstractMessageProcessorChain.process(AbstractMessageProcessorChain.java:66) 
    at org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor.execute(ExceptionToMessagingExceptionExecutionInterceptor.java:27) 
    at org.mule.execution.MessageProcessorExecutionTemplate.execute(MessageProcessorExecutionTemplate.java:43) 
    at org.mule.processor.AbstractInterceptingMessageProcessorBase.processNext(AbstractInterceptingMessageProcessorBase.java:105) 
    at org.mule.interceptor.AbstractEnvelopeInterceptor.process(AbstractEnvelopeInterceptor.java:55) 
    at org.mule.processor.AsyncInterceptingMessageProcessor.processNextTimed(AsyncInterceptingMessageProcessor.java:118) 
    at org.mule.processor.AsyncInterceptingMessageProcessor$AsyncMessageProcessorWorker$1.process(AsyncInterceptingMessageProcessor.java:186) 
    at org.mule.processor.AsyncInterceptingMessageProcessor$AsyncMessageProcessorWorker$1.process(AsyncInterceptingMessageProcessor.java:179) 
    at org.mule.execution.ExecuteCallbackInterceptor.execute(ExecuteCallbackInterceptor.java:20) 
    at org.mule.execution.HandleExceptionInterceptor.execute(HandleExceptionInterceptor.java:34) 
    at org.mule.execution.HandleExceptionInterceptor.execute(HandleExceptionInterceptor.java:18) 
    at org.mule.execution.BeginAndResolveTransactionInterceptor.execute(BeginAndResolveTransactionInterceptor.java:58) 
    at org.mule.execution.ResolvePreviousTransactionInterceptor.execute(ResolvePreviousTransactionInterceptor.java:48) 
    at org.mule.execution.SuspendXaTransactionInterceptor.execute(SuspendXaTransactionInterceptor.java:54) 
    at org.mule.execution.ValidateTransactionalStateInterceptor.execute(ValidateTransactionalStateInterceptor.java:44) 
    at org.mule.execution.IsolateCurrentTransactionInterceptor.execute(IsolateCurrentTransactionInterceptor.java:44) 
    at org.mule.execution.ExternalTransactionInterceptor.execute(ExternalTransactionInterceptor.java:52) 
    at org.mule.execution.RethrowExceptionInterceptor.execute(RethrowExceptionInterceptor.java:32) 
    at org.mule.execution.RethrowExceptionInterceptor.execute(RethrowExceptionInterceptor.java:17) 
    at org.mule.execution.TransactionalErrorHandlingExecutionTemplate.execute(TransactionalErrorHandlingExecutionTemplate.java:113) 
    at org.mule.execution.TransactionalErrorHandlingExecutionTemplate.execute(TransactionalErrorHandlingExecutionTemplate.java:34) 
    at org.mule.processor.AsyncInterceptingMessageProcessor$AsyncMessageProcessorWorker.doRun(AsyncInterceptingMessageProcessor.java:178) 
    at org.mule.work.AbstractMuleEventWork.run(AbstractMuleEventWork.java:43) 
    at org.mule.work.WorkerContext.run(WorkerContext.java:311) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: com.ctc.wstx.exc.WstxIOException: Attempted read on closed stream. 
    at com.ctc.wstx.stax.WstxInputFactory.doCreateSR(WstxInputFactory.java:536) 
    at com.ctc.wstx.stax.WstxInputFactory.createSR(WstxInputFactory.java:585) 
    at com.ctc.wstx.stax.WstxInputFactory.createSR(WstxInputFactory.java:610) 
    at com.ctc.wstx.stax.WstxInputFactory.createXMLStreamReader(WstxInputFactory.java:316) 
    at org.apache.cxf.staxutils.StaxUtils.createXMLStreamReader(StaxUtils.java:1179) 
    ... 50 more 
Caused by: java.io.IOException: Attempted read on closed stream. 
    at org.apache.commons.httpclient.AutoCloseInputStream.isReadAllowed(AutoCloseInputStream.java:183) 
    at org.apache.commons.httpclient.AutoCloseInputStream.read(AutoCloseInputStream.java:107) 
    at org.mule.model.streaming.DelegatingInputStream.read(DelegatingInputStream.java:63) 
    at java.io.FilterInputStream.read(Unknown Source) 
    at java.io.PushbackInputStream.read(Unknown Source) 
    at com.ctc.wstx.io.BaseReader.readBytes(BaseReader.java:155) 
    at com.ctc.wstx.io.UTF8Reader.loadMore(UTF8Reader.java:368) 
    at com.ctc.wstx.io.UTF8Reader.read(UTF8Reader.java:111) 
    at com.ctc.wstx.io.ReaderBootstrapper.initialLoad(ReaderBootstrapper.java:250) 
    at com.ctc.wstx.io.ReaderBootstrapper.bootstrapInput(ReaderBootstrapper.java:133) 
    at com.ctc.wstx.stax.WstxInputFactory.doCreateSR(WstxInputFactory.java:531) 
    ... 54 more 
ERROR 2013-02-21 15:38:09,972 [[test_auditor_client4].TestAuditorClient_CheckerFlow1.stage1.02] org.mule.exception.DefaultMessagingExceptionStrategy: 
******************************************************************************** 
Message    : Attempted read on closed stream.. Failed to route event via endpoint: org.mule.module.cxf.CxfOutboundMessageProcessor. Message payload is of type: PostMethod 
Code     : MULE_ERROR--2 
-------------------------------------------------------------------------------- 
Exception stack is: 
1. Attempted read on closed stream. (java.io.IOException) 
    org.apache.commons.httpclient.AutoCloseInputStream:183 (null) 
2. Attempted read on closed stream. (com.ctc.wstx.exc.WstxIOException) 
    com.ctc.wstx.stax.WstxInputFactory:536 (null) 
3. Couldn't parse stream. (java.lang.RuntimeException) 
    org.apache.cxf.staxutils.StaxUtils:1181 (null) 
4. Couldn't parse stream. (javax.xml.ws.soap.SOAPFaultException) 
    org.apache.cxf.jaxws.JaxWsClientProxy:156 (http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/xml/ws/soap/SOAPFaultException.html) 
5. Attempted read on closed stream.. Failed to route event via endpoint: org.mule.module.cxf.CxfOutboundMessageProcessor. Message payload is of type: PostMethod (org.mule.api.transport.DispatchException) 
    org.mule.module.cxf.CxfOutboundMessageProcessor:148 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transport/DispatchException.html) 
-------------------------------------------------------------------------------- 
Root Exception stack trace: 
java.io.IOException: Attempted read on closed stream. 
    at org.apache.commons.httpclient.AutoCloseInputStream.isReadAllowed(AutoCloseInputStream.java:183) 
    at org.apache.commons.httpclient.AutoCloseInputStream.read(AutoCloseInputStream.java:107) 
    at org.mule.model.streaming.DelegatingInputStream.read(DelegatingInputStream.java:63) 
    + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything) 
******************************************************************************** 

回答

0

发生了什么事是,HTTP出站相互作用的结果首先被作为前出站端点后,有什么处理传回CXF客户端。目前,流式载荷已被消耗,CXF无法处理。

你可以尝试以下方法:

<flow name="TestAuditorClient_CheckerFlow1" doc:name="TestAuditorClient_CheckerFlow1"> 
    <quartz:inbound-endpoint jobName="gen" repeatInterval="10000" responseTimeout="10000" 
     doc:name="Quartz"> <quartz:event-generator-job /> </quartz:inbound-endpoint> 
    <component class="wsdl.Payload" doc:name="Java"/> 
    <http:outbound-endpoint 
     address="http://192.168.66.7:8080/TestAuditorWebApp/TestService" 
     doc:name="HTTP" mimeType="text/xml"> 
     <cxf:jaxws-client operation="listTest" 
      clientClass="server.TestService_Service" port="TestServicePort" 
      wsdlLocation="http://192.168.66.7:8080/TestAuditorWebApp/TestService?wsdl" 
      enableMuleSoapHeaders="true" doc:name="SOAPY" /> 
    </http:outbound-endpoint> 
    <logger message="Received HTTP Response #[payload]" level="INFO" 
     doc:name="Logger" /> 
    <file:outbound-endpoint path="C:\tmp" 
     outputPattern="#[function:datestamp:dd-MM-yy]_#[function:systime].txt" 
     responseTimeout="10000" doc:name="Output File" /> 
</flow> 

的想法是定位于HTTP端点CXF互动。

请注意,我已将通用出站端点更改为HTTP,它不是强制性的,但至少您会更好地支持可用属性。

另请注意,CXF交互后流中的消息负载将是响应对象,而不是SOAP消息。您必须决定序列化策略(如JAXB)将其保存在文件中。

+0

谢谢大卫。今天早上我会试试这个。 – 2013-02-22 13:33:26

+0

我试过了你建议的流程,我现在看到的错误是: 错误2013-02-22 09:29:41,918 [[test_auditor_client4] .connector.file.mule.default.dispatcher.01] org .mule.exception.DefaultMessagingExceptionStrategy: 消息:一个无效的返回类型 “类java.io.InputStream中” 被用于变压器指定 “JAXBMarshallerTransformer” 代码:MULE_ERROR-266 – 2013-02-22 14:33:29

+0

根异常堆栈跟踪: org.mule.api.transformer .TransformerException:针对变量“JAXBMarshallerTransformer” \t在org.mule.module.xml中指定了无效的返回类型“类java.io.InputStream”。transformer.jaxb.JAXBMarshallerTransformer.doTransform(JAXBMarshallerTransformer.java:122) \t在org.mule.transformer.AbstractTransformer.transform(AbstractTransformer.java:411) \t在org.mule.DefaultMuleMessage.getPayload(DefaultMuleMessage.java:362) + 3更多(设置调试级别日志记录或'-Dmule.verbose.exceptions = true'的所有内容) – 2013-02-22 14:35:06

0

现在,大卫已转向我的方向是正确的时候,我会后说试试这个在未来的的利益答案:

的工作流程是:

<flow name="TestAuditorClient_CheckerFlow1" doc:name="TestAuditorClient_CheckerFlow1"> 
    <quartz:inbound-endpoint jobName="gen" 
     repeatInterval="10000" responseTimeout="10000" doc:name="Quartz"> 
     <quartz:event-generator-job /> 
    </quartz:inbound-endpoint> 
    <component class="wsdl.Payload" doc:name="Java" /> 
    <http:outbound-endpoint 
     address="http://192.168.66.7:8080/TestAuditorWebApp/TestService" 
     doc:name="HTTP" mimeType="text/xml"> 
     <cxf:jaxws-client operation="listTest" 
      clientClass="server.TestService_Service" port="TestServicePort" 
      wsdlLocation="http://192.168.66.7:8080/TestAuditorWebApp/TestService?wsdl" 
      enableMuleSoapHeaders="true" doc:name="SOAPY" /> 
    </http:outbound-endpoint> 
    <logger message="Received HTTP Response #[payload]" level="INFO" 
     doc:name="Logger" /> 
    <component class="wsdl.Payload" doc:name="Java"/> 
    <file:outbound-endpoint path="C:\tmp" 
     outputPattern="#[function:datestamp:dd-MM-yy]_#[function:systime].txt" 
     responseTimeout="10000" doc:name="Output File" /> 
</flow> 

请注意,我在HTTP请求之前和请求之后使用了一个wsdl.Payload类。这个单独的类用于生成请求并处理响应。

这是类:

package wsdl; 

import server.ListTest; 
import server.ListTestResponse; 

public class Payload { 

    public ListTest request() { 
    System.out.println("request response"); 
    return new ListTest(); 
} 

public String response(ListTestResponse listTestResponse) { 
    System.out.println("process response"); 
    StringBuilder sb = new StringBuilder(); 

    List<Test> testList = listTestResponse.getReturn(); 
    Iterator<Test> testIt = testList.iterator(); 
    while(testIt.hasNext()) { 
     Test test = testIt.next(); 
     sb.append(test.getName()).append(" ").append(test.getDescription()).append(", "); 
    } 
    return sb.toString(); 
} 
} 

瞧,现在骡子流量工程完全按照我的本意。