2013-02-21 91 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(); 
} 
} 

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