Как читать текстовый файл в муле 3.8
В муле 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.FlatFileSettings.loadSchema(FlatFileSettings.scala:45) на com.mulesoft.weave.module.flatfile.FlatFileReader.ffParser(FlatFileReader.FealsReader).)
4 ответа
При отключении потоковой передачи в файловом соединителе вам больше не нужно
<object-to-string/>
Вы можете настроить DataWeave на использование схемы плоского файла, как уже говорилось в другом ответе.
Если вы хотите использовать его так, как нужно, вы должны указать правильный тип пантомимы, в данном случае это
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.
DW в настоящее время не поддерживает отображение из неструктурированной строки, даже если вы объявляете MIME Type = text/plain upstream и устанавливаете для метаданных входной полезной нагрузки значение String в процессоре сообщений преобразования.
Поддерживаемые форматы данных (согласно документации Mule): Java, XML, JSON, CSV, Flat File, Excel, Fixed Width и Cobol copybook.
Дело здесь явно в формате фиксированной ширины.
@ Прасад, вообще ошибка No Schema Set
at бросает, когда входной тип MIME не установлен. В вашем случае кажется, что вы имеете дело с данными фиксированной ширины, поэтому вы либо определяете схему фиксированной ширины. эта статья может помочь.
Вместо того, чтобы переходить к dataweave, просто используйте компонент groovy, чтобы разделить полезную нагрузку по новой строке ('\n'). Не используйте файл для преобразования строки, это убивает Java-VM. Также просим кратко рассказать о том, что вам нужно, наконец, достичь в своем вопросе. Ура!