将JSON写入文件而不是XML的作业模块

时间:2015-04-10 08:51:39

标签: spring-batch spring-xd

我编写了一个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我不完全明白。一些方向将非常感激。

1 个答案:

答案 0 :(得分:0)

使用Spring XD TupleBuilder构建元组时,提供的tupleToStringConverter是将当前Tuple转换为JSON字符串的元组。因此,要在JSON中编写Tuple,您需要做的就是使用FlatFileItemWriterPassThroughLineAggregator,它只是在正在编写的对象上调用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());
    }
}