0

在 mule 3.8 中,当我使用文件连接器处理文本文件时,出现如下异常,请帮助。

这是流xml

file:connector name="File" autoDelete="true"  streaming="true" validateConnections="true" doc:name="File"/>

flow name="DW-FixedWidth-Processing">

file:inbound-endpoint path="D:/mule/input" connector-ref="File" responseTimeout="10000" doc:name="File"/>

file:file-to-string-transformer doc:name="File to String"/>

dw:transform-message doc:name="Transform Message">

dw:input-payload />

dw:set-payload><![CDATA[%dw 1.0
%output application/csv header=false
---
    ((payload splitBy /\n/)[0..8]) map {
    location:trim $[0..14],
    sku:trim $[15..39],
    dtc:trim $[40..42],
    tt:trim $[43..44],
    txnqty:trim $[45..54],
    um:trim $[55..56],
    rcd:trim $[57..59],
    te:trim $[60..89],
    ul:trim $[90..104],
    date:trim $[105..114],
    time:trim $[115..120]
} ]]>
dw:set-payload>

dw:transform-message>

logger message="#[message.payloadAs(java.lang.String)]" level="INFO" doc:name="Logger"/>

file:outbound-endpoint path="D:/mule/output" responseTimeout="10000" doc:name="File"/>

例外

根异常堆栈跟踪:

java.lang.IllegalStateException:在 com.mulesoft.weave.module.flatfile.FlatFileReader.ffParser(FlatFileReader.scala:42 的 com.mulesoft.weave.module.flatfile.FlatFileSettings.loadSchema(FlatFileSettings.scala:45) 没有设置模式)

4

4 回答 4

2

当您在文件连接器中禁用流式传输时,您不再需要

<object-to-string/>

如另一个答案中所述,您可以将 DataWeave 配置为使用平面文件模式。

当你想以这种方式使用它时,你必须告诉正确的 mime 类型,在这种情况下是

application/java

您可以在 DataWeave 之前的任何消息处理器上执行此操作,在本例中为 file:inbound-endpoint。或者您可以在 DataWeave 本身中执行此操作(不幸的是,这仅在您将 Studio 切换到 XML 时可见)。

对我来说,一切都遵循以下流程:

    <file:connector name="File" autoDelete="false" streaming="false" validateConnections="true" doc:name="File"/>

    <flow name="dw-testFlow">
        <file:inbound-endpoint path="in" moveToDirectory="processed" connector-ref="File" responseTimeout="10000" mimeType="application/java" doc:name="File">
            <file:filename-regex-filter pattern=".*\.txt" caseSensitive="true"/>
        </file:inbound-endpoint>
        <dw:transform-message doc:name="Transform Message">
            <dw:set-payload><![CDATA[%dw 1.0
%output application/java
---
((payload splitBy /\n/)) map {
location:trim $[0..14],
sku:trim $[15..39],
dtc:trim $[40..42],
tt:trim $[43..44],
txnqty:trim $[45..54],
um:trim $[55..56],
rcd:trim $[57..59],
te:trim $[60..89],
ul:trim $[90..104],
date:trim $[105..114],
time:trim $[115..120]
}
]]></dw:set-payload>
        </dw:transform-message>
        <logger message="#[payload]" level="INFO" doc:name="Logger"/>
    </flow>

DataWeave 的结果是一个 HashMap 列表。

于 2016-08-26T09:33:25.960 回答
1

DW 目前不支持从非结构化字符串映射,即使您在上游声明 MIME Type = text/plain 并且在转换消息处理器中将输入有效负载元数据设置为 String。

支持的数据格式(根据Mule 文档)是 Java、XML、JSON、CSV、平面文件、Excel、固定宽度和 Cobol 字帖。

这里的情况显然是固定宽度格式。

于 2016-11-03T09:05:22.227 回答
0

@Prasad,通常在No Schema Set未设置输入 mime 类型时抛出错误。在您的情况下,您似乎正在处理固定宽度的数据,因此您要么定义一个固定宽度的模式。这篇文章可能会有所帮助。

于 2016-08-26T14:27:56.250 回答
0

无需使用数据编织,只需使用 groovy 组件按新行('\n')拆分有效负载。不要使用文件到字符串转换器它会杀死 Java-VM。还请在您的问题中简要介绍您最终需要实现的目标。干杯!

于 2016-08-29T06:41:52.670 回答