我已经设法在骡子中再次迷惑自己。
我必须接受来自供应商的平面文件,并且无法重新格式化文件。该文件具有大量具有固定宽度字段的记录,非常适合mule数据映射器。这很好,映射到java POJO以创建要处理的记录集合。
问题:文件中的最后一条记录是完全不同格式的摘要记录。问题是,格式不仅改变了数据布局,而且记录长度也发生了变化。这与数据映射器不同,因为记录对于格式定义来说太短了。
对于如何在文件中允许这种类型的混合格式有任何想法,或者我需要使用自定义变换器来分割记录并对记录长度作出单独的格式,而不是标准的mule功能吗?
是的,我知道这种平面文件的使用已经过时,但处理遗留系统需要接受生成的数据,直到系统退役为止。
答案 0 :(得分:1)
我仍然对其他解决方案持开放态度,但我怀疑开箱即用数据映射器是否可以实现这一目标。对于我认为的一般解决方案来说有点过于深奥。
在听到精彩的解决方法之前,我目前的方法是使用java组件按记录分割文件并提取控件值并通过选择控件按类型分隔记录。然后调用Java组件来映射字段并在每个分支中为特殊记录和主体记录分别执行业务逻辑,例如:
<file:connector name="File" autoDelete="true" streaming="true"
validateConnections="true" doc:name="File"/>
<spring:beans>
<spring:bean name="sumRec" class="com.mypackage.SummaryRecord" />
<spring:bean name="detailRec" class="com.mypackage.DetailRecord" />
</spring:beans>
<flow name="FlatToFile">
<file:inbound-endpoint path="/SourceDir/Work"
moveToDirectory="/SourceDir/Archive"
doc:name="FlatFileIn" connector-ref="File" >
<file:filename-wildcard-filter pattern="*.txt" caseSensitive="false" />
</file:inbound-endpoint>
<component class="com.mypackage.FlatFileReader" doc:name="Split file and dispatch to VM" />
</flow>
<flow name="processRecords">
<vm:inbound-endpoint exchange-pattern="one-way" path="in" doc:name="VM" />
<object-to-string-transformer doc:name="Object to String"/>
<set-variable variableName="recType" value="#message.payload.substring(0,7)]" doc:name="Variable"/>
<choice doc:name="Choice">
<when expression="flowVars.recType == '9999999'" >
<expression-component doc:name="Expression">
message.outboundProperties.recCount = app.registry.sumRec.process(message.payload);
</expression-component>
</when>
<otherwise>
<expression-component doc:name="Expression">
app.registry.detailRec.process(message.payload);
</expression-component>
</otherwise>
</choice>
</flow>
</mule>
FlatFileReader从Java调用VM端点。
答案 1 :(得分:0)
您可以在csv属性中将错误策略设置为Lenient。