我编写了一个spring jd job模块,它从jdbc导出到xml。几个星期前。使用Tuple作为数据结构。然后使用oxm将Tuples写入文件。
<bean id="xmlItemWriter" class="org.springframework.batch.item.xml.StaxEventItemWriter" scope="step">
<property name="resource"
value="file:${exportDir}/#{jobParameters['jobKey']}/#{stepExecutionContext['orderFileNamePrefix']}-#{stepExecutionContext['tableFileName']}.${exportFileExtension}" />
<property name="marshaller" ref="marshaller" />
<property name="rootTagName" value="#{stepExecutionContext['tableFileName']}" />
</bean>
<bean id="marshaller" class="org.springframework.oxm.xstream.XStreamMarshaller" scope="step">
<property name="aliases">
<util:map id="aliases">
<entry key="#{stepExecutionContext['tableFileName']}" value="org.springframework.xd.tuple.batch.TupleFieldExtractor" />
</util:map>
</property>
</bean>
生成的xml相当随意。但是不需要特定的xml架构。
现在我正在进行导入部分,使用json而不是xml作为平面文件格式是一项新要求。所以我正在寻找我可以对导出模块做出的最小改变,因此它写出了json而不是xml。在Spring xd中,似乎使用源,流和接收器可以更好地实现这种应用。但我现在坚持使用作业模块,因为将UI与spring xd集成的系统会通过REST API自动设置定义。
由于Spring的类型转换基础设施,我认为使用Tuples和JSON会很容易。我只是无法弄清楚如何在spring xd job module上下文中实现。
所以在作业模块中,我应该使用什么类型的编写器来编写使用json作为格式的文件列表? 我应该使用什么读者将json文件读取到元组列表?
我承认有很多春天xd我不完全明白。一些方向将非常感激。
答案 0 :(得分:0)
使用Spring XD TupleBuilder
构建元组时,提供的tupleToStringConverter
是将当前Tuple
转换为JSON字符串的元组。因此,要在JSON中编写Tuple
,您需要做的就是使用FlatFileItemWriter
和PassThroughLineAggregator
,它只是在正在编写的对象上调用toString
。请记住,这种方法会为您留下一个文件,其中每一行都是一个完整的JSON对象,而整个文件本身不是一个有效的JSON对象。
在阅读方面,我认为你需要做一些包装。 Spring XD提供JsonByteToTupleConverter
byte[]
并将其转换为Tuple
,但我们不会提供包含它的LineMapper
。虽然我还没有对它进行测试,但我希望以下工作正常(假设line
包含有效的JSON字符串):
public class JsonToTupleLineMapper<Tuple> implements LineMapper<Tuple> {
private Converter converter = new JsonByteToTupleConverter();
@Override
public Tuple mapLine(String line, int lineNumber) throws Exception {
return converter.convert(line.getBytes());
}
}