0

以下に示すミュール フローを使用して、Web サービスの簡単なリクエストを作成しています。リクエストは正常に送信され、wireshark を使用すると、適切な応答のように見えます。

(ファイルへの応答をキャプチャするために) 出力ファイル エンドポイントを含めるまで、例外は見られませんでした。この例外 (下部に含まれています) があっても、生成された出力ファイルを調べると、多くの場合、データの唯一の部分ですが、データが表示されます。

この例外の原因は何ですか?

フローは次のとおりです。

<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:      org.mule.module.cxf.transport.MuleUniversalConduit$1@69d7ef58
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 org.mule.transport.http.ReleasingInputStream@5e8aa5e1
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)
********************************************************************************
4

2 に答える 2

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>

アイデアは、CXFインタラクションをHTTPエンドポイントにローカライズすることです。

汎用のアウトバウンドエンドポイントをHTTPエンドポイントに変更したことに注意してください。これは必須ではありませんが、少なくとも、使用可能なプロパティのサポートが向上します。

また、CXFインタラクション後のフローのメッセージペイロードは、SOAPメッセージではなく、応答オブジェクトになることに注意してください。ファイルに保存するには、シリアル化戦略(JAXBなど)を決定する必要があります。

于 2013-02-21T21:55:03.127 に答える
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();
}
}

これで、ミュール フローが意図したとおりに機能するようになりました。

于 2013-02-22T15:10:47.687 に答える