ule子选择表达式给出流关闭错误

Cha*_*iya 1 java mule

我在下面的m子流程中,根据输入xml文件的类型(使用选择)将xml消息转换为平面格式,然后trnsfer然后转换为ftp。但是,一旦我发出一条消息,它就会给出以下异常。你们能帮忙找出问题所在吗?

<flow name="AWOutboundFlow">
    <file:inbound-endpoint path="E:\MuleTemp\DBS\outbound\aw\in" responseTimeout="10000" doc:name="File"/>
    <set-variable variableName="millis" value="#[System.currentTimeMillis()]" doc:name="Variable"/>
    <logger message="#[flowVars['millis']]" level="INFO" doc:name="Logger"/>
    <choice doc:name="Choice">
        <when expression="#[xpath3('/cw:UniversalShipment/cw:Shipment/cw:TransportMode/cw:Code') == 'AIR']">
            <logger message="#[flowVars['millis']]: Classified to AW" level="INFO" doc:name="Logger"/>
            <mulexml:jaxb-xml-to-object-transformer returnClass="com.chasoft.schema.UniversalShipmentData" encoding="UTF-8" mimeType="text/xml" jaxbContext-ref="JAXB_Context" doc:name="XML to JAXB Object"/>
            <transformer ref="AWShipmentOutbound" doc:name="Transformer Reference"/>
            <ftp:outbound-endpoint binary="true" host="localhost" port="21" path="/outbound/aw/out" user="DBS" password="502011" responseTimeout="60000" doc:name="FTP" outputPattern="aw_out_#[flowVars['millis']].dat" encoding="UTF-8">
                <reconnect frequency="10000"/>
            </ftp:outbound-endpoint>
        </when>
        <when expression="#[xpath3('/cw:UniversalShipment/cw:Shipment/cw:TransportMode/cw:Code') == 'SEA']">
            <logger message="#[flowVars['millis']]: Classified to BL" level="INFO" doc:name="Logger"/>
            <mulexml:jaxb-xml-to-object-transformer returnClass="com.chasoft.schema.UniversalShipmentData" encoding="UTF-8" mimeType="text/xml" jaxbContext-ref="JAXB_Context" doc:name="XML to JAXB Object"/>
            <transformer ref="BLShipmentOutbound" doc:name="Transformer Reference"/>
            <ftp:outbound-endpoint binary="true" host="localhost" port="21" path="/outbound/bl/out" user="DBS" password="502011" responseTimeout="60000" doc:name="FTP" outputPattern="bl_out_#[flowVars['millis']].dat"/>
        </when>
        <when expression="#[xpath3('/cw:UniversalEvent/cw:Event/cw:EventTime') != '']">
            <logger message="#[flowVars['millis']]: Classified toEVENT" level="INFO" doc:name="Logger"/>
            <mulexml:jaxb-xml-to-object-transformer jaxbContext-ref="JAXB_Context" doc:name="XML to JAXB Object" encoding="UTF-8" mimeType="text/xml" returnClass="com.chasoft.schema.UniversalEventData"/>
            <transformer ref="EventOutbound" doc:name="Transformer Reference"/>
            <ftp:outbound-endpoint binary="true" host="localhost" port="21" path="/outbound/event/out" user="DBS" password="502011" responseTimeout="60000" doc:name="FTP" outputPattern="event_out_#[flowVars['millis']].dat"/>
        </when>
        <otherwise>
            <logger level="INFO" message="#[flowVars['millis']]: UNKNOWN Classification" doc:name="Logger"/>
        </otherwise>
    </choice>
</flow>
Run Code Online (Sandbox Code Playgroud)

样本输入文件的草稿:

<UniversalShipment xmlns="http://www.cargowise.com/Schemas/Universal/2011/11" version="1.1">
    <Shipment>
      .....
        <TransportMode>
            <Code>AIR</Code>
            <Description>Air Freight</Description>
        </TransportMode>
Run Code Online (Sandbox Code Playgroud)

例外:

错误2016-01-27 23:03:17,453 [[dbschenker] .AWOutboundFlow.stage1.04] org.mule.exception.DefaultMessagingExceptionStrategy:Message:执行表达式“ xpath3('/ cw:UniversalShipment / cw:Shipment / cw :TransportMode / cw:Code')=='SEA'“失败。(org.mule.api.expression.ExpressionRuntimeException)。消息有效负载的类型为:DeferredDocumentImpl类型:org.mule.api.MessagingException代码:MULE_ERROR--2 JavaDoc:http : //www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/MessagingException。 html 有效负载:[#document:null]

异常堆栈为:1.流关闭(java.io.IOException)java.io.FileInputStream:-2(空)2. java.io.IOException:流关闭(org.mule.api.MuleRuntimeException)org.mule.module .xml.el.XPath3Function:151(http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/MuleRuntimeException.html)3. [错误:java.io.IOException:流已关闭] [附近:{... xpath3('/ cw:UniversalShipment / ....}] ^ [Line:1,列:1](org.mule.mvel2.CompileException)org.mule.mvel2.optimizers.impl .refl.ReflectiveAccessorOptimizer:438(http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/mvel2/CompileException.html)4.表达式“ xpath3('/ cw:UniversalShipment / cw:Shipment / cw:TransportMode / cw:Code')=='SEA'”的执行失败。(org.mule.api.expression.ExpressionRuntimeException)org.mule.el.mvel.MVELExpressionLanguage:232(http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/expression/ExpressionRuntimeException .html)5.表达式“ xpath3('/ cw:UniversalShipment / cw:Shipment / cw:TransportMode / cw:Code')=='SEA'”的执行失败。(org.mule.api.expression.ExpressionRuntimeException)。消息有效负载的类型为:DeferredDocumentImpl(org.mule.api.MessagingException)org.mule.execution.ExceptionToMessagingExceptionExecutionInterceptor:32(http://www.mulesoft。

Dav*_*sot 5

这是正在发生的事情:

  • ule子拾取一个文件并InputStream从中创建一个文件,
  • 它计算第一个xpath3表达式,或者,这将消耗流以读取文件,
  • 它尝试评估第二个xpath3表达式并死于火灾,因为该表达式InputStream已被消耗,关闭且无法再读取。

解决方案:在消息处理器之前InputStream用来反序列化,以便可以在下游处理器中一次又一次地读取其内容。byte[]choice<object-to-byte-array-transformer />