0

当我在一个流中使用两个 HTTP 端点时,Mule 会抛出这个异常。我找到了解决这个问题的方法:在异步模式下使用第二个 HTTP 端点,但这不是一个好方法。

ERROR DefaultSystemExceptionStrategy [[testdemo].connector.http.mule.default.receiver.03]: Caught exception in Exception Strategy: Attempted read on closed stream.
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:126)
    at org.mule.model.streaming.DelegatingInputStream.read(DelegatingInputStream.java:58)
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1025)
    at org.mule.transformer.simple.ObjectToOutputHandler$3.write(ObjectToOutputHandler.java:76)
    at org.mule.transport.http.HttpServerConnection.writeResponse(HttpServerConnection.java:315)
    at org.mule.transport.http.HttpMessageReceiver$HttpWorker.run(HttpMessageReceiver.java:164)
    at org.mule.work.WorkerContext.run(WorkerContext.java:311)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

我的代码:

<flow doc:name="httpPost" name="httpPost">
    <http:inbound-endpoint doc:name="HTTP" keep-alive="true"
        exchange-pattern="request-response" host="localhost" path="service"
        port="8082" />

    <http:body-to-parameter-map-transformer />

    <!-- This component is just set to show the message accecpted from the request -->
    <scripting:component>
        <scripting:script engine="groovy">
            println payload['name']
            return payload['name']+'123'
        </scripting:script>
    </scripting:component>
</flow>

<flow doc:name="httpPost" name="client">
    <http:inbound-endpoint doc:name="HTTP" name="httpClient"
        exchange-pattern="request-response" host="localhost" path="client"
        port="8082" encoding="UTF-8" />

    <http:body-to-parameter-map-transformer />

    <scripting:component>
        <scripting:script engine="groovy">
            payload['name'] = 'opasso'
            def paramstr = ""
                for( param in payload){
                paramstr = paramstr + "&amp;" + param.key+ "=" + param.value
            }
            println "querystr:$paramstr"
            return paramstr.substring(1)
        </scripting:script>
    </scripting:component>

    <http:outbound-endpoint address="http://localhost:8082/service"
        exchange-pattern="request-response" contentType="application/x-www-form-urlencoded"
        method="POST" encoding="UTF-8" />

    <!-- This component is just set to show the message accecpted from the request -->
    <scripting:component>
        <scripting:script engine="groovy">
            def msg = "return payload:$payload;".toString()
            println msg
            return payload
        </scripting:script>
    </scripting:component>
</flow>
4

1 回答 1

0

该问题与您在scripting:component使用http:outbound-endpoint. 该脚本可能会消耗输入流,使其处于无法再使用的状态。

尝试在 之后添加一个<object-to-string-transformer />权利http:outbound-endpoint以将流反序列化为字符串,以便有效负载可以在scripting:component和 Mule 中使用。

于 2013-04-04T15:42:55.050 回答