Spring batch 使用Spring批处理实现ETL

Spring batch 使用Spring批处理实现ETL,spring-batch,batch-processing,Spring Batch,Batch Processing,我需要为我正在进行的一个项目实现一个ETL应用程序 它有以下步骤: 需要从表中读取以检索将要 作为作业参数传入 步骤1返回的对象将进一步用于检索 一些数据来自第二个表 然后必须从一个平面文件中读取,该平面文件将与 步骤2中的值。应用业务逻辑。然后写一张表 我们使用的是Spring数据JPA,Spring集成 我面临的挑战是从表中读取值以检索作业的参数,然后启动作业 然后,步骤2的输出必须与文件信息一起发送,以便进一步处理 我知道如何独立地实施上述步骤,但很难将它们从一端连接到另一端 分享任何设计

我需要为我正在进行的一个项目实现一个ETL应用程序

它有以下步骤:

  • 需要从表中读取以检索将要 作为作业参数传入
  • 步骤1返回的对象将进一步用于检索 一些数据来自第二个表
  • 然后必须从一个平面文件中读取,该平面文件将与 步骤2中的值。应用业务逻辑。然后写一张表
  • 我们使用的是Spring数据JPA,Spring集成

    我面临的挑战是从表中读取值以检索作业的参数,然后启动作业

    然后,步骤2的输出必须与文件信息一起发送,以便进一步处理

    我知道如何独立地实施上述步骤,但很难将它们从一端连接到另一端


    分享任何设计上述内容的想法都会很好。提前谢谢。

    我会试着给你一些不同观点的想法

    1-读取表格值并将其作为作业参数传递

    我在这里看到两种解决方案:

    您可以执行“手动”查询(即不使用springbatch),然后执行业务逻辑以将结果作为作业参数传递(您只需要一个
    JobLauncher
    CommandLineJobRunner
    ,请参阅):

    在每种情况下,您都可以使用SpringBatch
    ItemReader
    进行查询。例如,您可以将项读取器声明为侦听器的字段(不要忘记setter),并将其配置为:

    <batch:listener>
        <bean class="xx.xx.xx.YourListener">
            <property name="reader">
                <bean class="org.springframework.batch.item.database.JdbcCursorItemReader">
                    <property name="dataSource" ref="dataSource"></property>
                    <property name="sql" value="${yourSQL}"></property>
                     <property name="rowMapper">
                        <bean class="xx.xx.xx.YourRowMapper"></bean>
                    </property>
                </bean>
            </property>
        </bean>
    </batch:listener>
    
    
    
    2-根据上一步的结果读取表格

    同样,您可以使用
    JobExecutionContext
    在步骤之间存储和检索数据。然后,您可以实现一个
    StepExecutionListener
    来覆盖方法
    beforeStep
    并访问
    StepExecution
    ,这将引导您进入
    JobExecution

    3-将表格读取结果与文件读取结果一起发送

    没有“默认”
    CompositeItemReader
    可以让您同时读取两个源,但我认为这不是您真正想要做的


    对于您的情况,我将在
    中将“表读取器”声明为读取器,然后声明一个自定义
    ItemProcessor
    ,它将具有另一个
    ItemReader
    字段。此读取器将是您的
    FlatFileItemReader
    。然后,您可以手动启动读取,并在
    过程
    方法中应用您的业务逻辑。

    谢谢。让我试试建议的方法,看看效果如何
    @Override
    public void beforeJob(JobExecution jobExecution) {
    
        // Do your business logic and your database query here.
    
        jobExecution.getExecutionContext().put(key, value);
    }
    
    <batch:listener>
        <bean class="xx.xx.xx.YourListener">
            <property name="reader">
                <bean class="org.springframework.batch.item.database.JdbcCursorItemReader">
                    <property name="dataSource" ref="dataSource"></property>
                    <property name="sql" value="${yourSQL}"></property>
                     <property name="rowMapper">
                        <bean class="xx.xx.xx.YourRowMapper"></bean>
                    </property>
                </bean>
            </property>
        </bean>
    </batch:listener>