我尝试使用spring batch从一个表中阅读数据并写入其他表,但现在我的要求是从多个表中读取数据并写入文件,因此我们可以通过定义多个作业来实现这一点,但我想使用单个作业来实现,这意味着单个读取器,单个写入器和单个处理器。请为这个场景提供一些参考。
avwztpqn1#
Spring 批次提供的类是不可能的,但你可以找到一种方法。就在chunk处理添加一个步骤之前,创建一个自定义的tasklet,在其中您将分配不同的sql和不同的输出文件,并使它们在循环中运行,只要有sql要执行。这可能听起来很难,但我在同样的情况下工作,这里有一些想法,你可以做到这一点-
chunk
<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。希望能帮上忙。
cgvd09ve2#
您可以尝试this answer中详细介绍的内容。简而言之,您可以使用CompositeItemReader向其添加单独的读取器,以便从您想要的任何数据库读取。每个读取器都可以有自己的数据源,因此您实际上可以从不同的服务器读取。每个读取器也可以有自己的查询,因此您也可以从不同的表中读取。然后,在统一行Map器中,将两个表合并为一个表,以便进一步处理。如果你需要从同一个数据库中读取这些表,如果可能的话,你可以在查询本身中使用连接等。
2条答案
按热度按时间avwztpqn1#
Spring 批次提供的类是不可能的,但你可以找到一种方法。
就在
chunk
处理添加一个步骤之前,创建一个自定义的tasklet,在其中您将分配不同的sql和不同的输出文件,并使它们在循环中运行,只要有sql要执行。这可能听起来很难,但我在同样的情况下工作,这里有一些想法,你可以做到这一点-
这里是setReaderWriter的bean
任何你需要在Reader或Writer中动态添加的东西。上面的sqlMap是sql作为key和Output file作为value的Map。
希望能帮上忙。
cgvd09ve2#
您可以尝试this answer中详细介绍的内容。简而言之,您可以使用CompositeItemReader向其添加单独的读取器,以便从您想要的任何数据库读取。每个读取器都可以有自己的数据源,因此您实际上可以从不同的服务器读取。每个读取器也可以有自己的查询,因此您也可以从不同的表中读取。然后,在统一行Map器中,将两个表合并为一个表,以便进一步处理。如果你需要从同一个数据库中读取这些表,如果可能的话,你可以在查询本身中使用连接等。