ESB Mule: сервлет - java.io.IOException: попытка чтения в закрытом потоке

Я использую Mule ESB версии 3.5.0

Я настроил проект в Anypoint Studio, содержащий поток, который принимал запросы с использованием http: inbound-endpoint, добавил заголовок SOAP в тело и перенаправил его во внешнее веб-приложение. Я использовал графический интерфейс пользователя, и это прекрасно работало. Xml, который был сгенерирован следующим образом:

<flow name="Online_Service" doc:name="Online_Service">
    <http:inbound-endpoint exchange-pattern="request-response" name="clientEndpoint" address="http://localhost:1234/in" doc:name="HTTP" contentType="text/xml"/>
    <component doc:name="SOAP Header Creator">
        <spring-object bean="SoapHeaderCreatorBean"/>
    </component>
    <file:outbound-endpoint path="C:/mule/Online/OUT" responseTimeout="10000" doc:name="Requests"/>
    <http:outbound-endpoint exchange-pattern="request-response" address="http://localhost:8080/spring-webservices-sample/endpoints" doc:name="HTTP"  method="POST" contentType="text/xml"/>
    <file:outbound-endpoint path="C:/mule/Online/OUT" responseTimeout="10000" doc:name="Responses"/>
</flow>

Затем возникла необходимость упаковать приложение mule как войну, чтобы развернуть его на сервере приложений Tomcat. Мне удалось создать войну и потоки, которые исходили из файловой системы вместо конечной точки HTTP, отлично работают. Прочитав документацию, я обнаружил, что конечную точку HTTP нельзя использовать в контексте сервлета, и адаптировал свой поток к этому:

<flow name="onlineService" processingStrategy="synchronous">
    <servlet:inbound-endpoint path="/in" responseTimeout="10000" />
    <component>
        <spring-object bean="SoapHeaderCreatorBean"/>
    </component>
    <file:outbound-endpoint path="C:/mule/Online/Requests" responseTimeout="10000"/>
    <http:outbound-endpoint exchange-pattern="request-response" address="http://localhost:8080/spring-webservices-sample/endpoints" method="POST" contentType="text/xml"/>
    <file:outbound-endpoint path="C:/mule/Online/Responses" responseTimeout="10000"/>
</flow>

Однако теперь, если я отправляю контент сервлету, я получаю следующее исключение:

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:54)
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1025)
    at org.mule.transformer.simple.ObjectToOutputHandler$3.write(ObjectToOutputHandler.java:72)
    at org.mule.transport.servlet.AbstractReceiverServlet.writeResponseFromMessage(AbstractReceiverServlet.java:185)
    at org.mule.transport.servlet.AbstractReceiverServlet.writeResponse(AbstractReceiverServlet.java:157)
    at org.mule.transport.servlet.MuleReceiverServlet.doAllMethods(MuleReceiverServlet.java:246)
    at org.mule.transport.servlet.MuleReceiverServlet.doPost(MuleReceiverServlet.java:194)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at org.mule.transport.servlet.MuleReceiverServlet.service(MuleReceiverServlet.java:176)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at com.googlecode.psiprobe.Tomcat70AgentValve.invoke(Tomcat70AgentValve.java:38)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    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:745)

Я пытался добавить:<object-to-string-transformer />компонент после определения сервлета, но это, похоже, не помогает...

1 ответ

Решение

Я обнаружил проблему: http: исходящая конечная точка дает поток, а файл: исходящая конечная точка потребляет это. Я поставил преобразователь (объект-строка) после исходящей конечной точки HTTP, и это решает мою проблему:

<flow name="onlineService" processingStrategy="synchronous">
    <servlet:inbound-endpoint path="/in" responseTimeout="10000" />
    <component>
        <spring-object bean="SoapHeaderCreatorBean"/>
    </component>
    <file:outbound-endpoint path="C:/mule/Online/Requests" responseTimeout="10000"/>
    <http:outbound-endpoint exchange-pattern="request-response" address="http://localhost:8080/spring-webservices-sample/endpoints" method="POST" contentType="text/xml"/>
    <object-to-string-transformer/>
    <file:outbound-endpoint path="C:/mule/Online/Responses" responseTimeout="10000"/>
</flow>

Таким образом, поток сохраняется в памяти и не используется до того, как ответ возвращается во входящую конечную точку HTTP.

Другие вопросы по тегам