如何使用Spring批处理从DB中的多个表中读取数据

6tr1vspr  于 2023-05-16  发布在  Spring
关注(0)|答案(2)|浏览(158)

我尝试使用spring batch从一个表中阅读数据并写入其他表,但现在我的要求是从多个表中读取数据并写入文件,因此我们可以通过定义多个作业来实现这一点,但我想使用单个作业来实现,这意味着单个读取器,单个写入器和单个处理器。
请为这个场景提供一些参考。

avwztpqn

avwztpqn1#

Spring 批次提供的类是不可能的,但你可以找到一种方法。
就在chunk处理添加一个步骤之前,创建一个自定义的tasklet,在其中您将分配不同的sql和不同的输出文件,并使它们在循环中运行,只要有sql要执行。
这可能听起来很难,但我在同样的情况下工作,这里有一些想法,你可以做到这一点-

<flow id="databaseReadWriteJob">
            <step id="step1_setReaderWriter">
                <tasklet ref="setReaderWriter" />
                <next on="FAILED" to="" />
                <next on="*" to="dataExtractionStep" />
            </step>
            <step id="dataExtractionStep">
                <tasklet>
                    <chunk reader="dbReader" writer="flatFileWriter" commit-interval="${commit-interval}" />
</tasklet>
                <next on="FAILED" to="" />
                <next on="*" to="step3_removeProcessedSql" />
            </step>
            <step id="step3_removeProcessedSql">
                <tasklet ref="removeProcessedSql" />
                <next on="NOOP" to="step1_setReaderWriter" />
                <next on="*" to="step4_validateNumOfSuccessfulSteps" />
            </step>
    </flow>

这里是setReaderWriter的bean

<beans:bean id="setReaderWriter" class="SetReaderWriter">
        <beans:property name="reader" ref="dbReader" />
        <beans:property name="flatFileWriter" ref="flatFileWriter" />
        <beans:property name="fileSqlMap" ref="jobSqlFileMap" />
        <beans:property name="fileNameBuilder" ref="localFileNameBuilder" />
        <beans:property name="sourceFolder" value="${dataDir}" />
        <beans:property name="dateDiff" value="${dateDiff}" />

任何你需要在Reader或Writer中动态添加的东西。上面的sqlMap是sql作为key和Output file作为value的Map。
希望能帮上忙。

cgvd09ve

cgvd09ve2#

您可以尝试this answer中详细介绍的内容。简而言之,您可以使用CompositeItemReader向其添加单独的读取器,以便从您想要的任何数据库读取。每个读取器都可以有自己的数据源,因此您实际上可以从不同的服务器读取。每个读取器也可以有自己的查询,因此您也可以从不同的表中读取。然后,在统一行Map器中,将两个表合并为一个表,以便进一步处理。如果你需要从同一个数据库中读取这些表,如果可能的话,你可以在查询本身中使用连接等。

相关问题