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

A job module that writes JSON to file instead of XML

我写了一个 spring xd 作业模块,从 jdbc 导出到 xml。几周前。正在使用 Tuple 作为数据结构。然后使用 oxm 将元组写入文件。

<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.

自动设置定义

我原以为使用元组和 JSON 会很容易,因为 Spring 的类型转换基础设施。我只是不知道如何在 spring xd 作业模块上下文中实现。

那么在作业模块中,我应该使用什么类型的编写器来使用 json 作为格式将元组列表写入文件? 我应该使用什么 reader 来将 json 文件读取到元组列表?

我承认有很多 spring xd 我不完全理解。一些指导将不胜感激。

使用 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());
    }
}