【问题标题】:Spring batch job to update different tablesSpring批处理作业更新不同的表
【发布时间】:2015-11-16 12:42:21
【问题描述】:

我正在阅读文章 http://spring.io/guides/gs/batch-processing/,它解释了读取 csv 并将其写回数据库。我想知道如何读取多个 CSV 文件,例如 A.csv、B.csv 等,并将内容写回各自的表 table_A、table_B 等。请注意每个 csv 文件的内容应该放在不同的表中。

【问题讨论】:

    标签: spring spring-boot spring-batch


    【解决方案1】:

    这里的基本用例是创建与 CSV 文件一样多的步骤(因为没有默认的 MultiResourceItemReader 实现)。

    您的每一步都将读取一个 CSV(带有 FlatFileItemReader)并写入您的数据库(使用 JdbcBatchItemWriter 或另一个同类)。尽管您将有多个步骤,但如果您的 CSV 文件具有相同的格式(列、分隔符),您可以使用 AbstractStep 分解配置。请参阅文档:http://docs.spring.io/spring-batch/trunk/reference/html/configureStep.html

    如果没有,那么至少可以共享LineMapperItemPreparedStatementSetterDataSource等常用属性。


    更新

    以下是供读者和作者参考的示例:

        <bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader">
            <property name="resource" value="yourFile.csv" />
            <property name="lineMapper">
                <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
                    <property name="lineTokenizer">
                        <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                            <property name="names" value="column1,column2,column3..." />
                        </bean>
                    </property>
                    <property name="fieldSetMapper">
                        <bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
                            <property name="prototypeBeanName" value="yourBeanClass" />
                        </bean>
                    </property>
                </bean>
            </property>
        </bean>
    
        <bean id="writer" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
            <property name="dataSource" ref="dataSource" />
            <property name="sql">
                <value>
                    <![CDATA[        
                        insert into YOUR_TABLE(column1,column2,column3...) 
                        values (:beanField1, :beanField2, :beanField3...)
                    ]]>
                </value>
            </property>
            <property name="itemSqlParameterSourceProvider">
                <bean class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" />
            </property>
        </bean>
    

    更新 2

    这是一个链接作业中的步骤的示例(使用基于 Java 的配置):

    @Bean
    public Job job() {
         return jobBuilderFactory().get("job").incrementer(new RunIdIncrementer())
         .start(step1()).next(step2()).build();
    }
    

    【讨论】:

    • 谢谢。这是否意味着我为每个 csv 创建一个 BatchConfiguration 类,该类具有该 csv 的读取器和写入器。以及在这种情况下如何定义作业和步骤.. 他们会去哪个文件
    • @dazzle 我建议你看一些关于如何创建 Spring Batch 作业的教程。您还应该阅读官方文档(从这里开始):docs.spring.io/spring-batch/reference/html/configureJob.html。我还举了读者和作家的例子。
    • 谢谢。我很清楚读者和作者,因为我在问题中粘贴的链接显示了它们是如何定义的。我唯一的问题是(如果您查看上面链接中的 BatchConfiguration.java)我将如何定义具有不同步骤的新作业(每个步骤针对每个 csv)
    • @dazzle 抱歉,我没有仔细阅读您的问题:D 由于您使用“java”方式来创建步骤和工作,我想您只需创建一个不同的方法对于每个步骤(具有自己的配置),然后是一个 Job 方法,它将在步骤之间创建一个链。我又更新了帖子。
    • 谢谢,明天试试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2018-05-22
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多