使用Spring Batch实现ETL

时间:2015-10-06 02:02:46

标签: spring-batch batch-processing

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

它有以下步骤:

  1. 需要从表中读取以检索将要的某些值 作为工作参数传入。
  2. 步骤1的返回对象将进一步用于检索 来自第二张桌子的一些数据。
  3. 然后必须读取将与之一起使用的平面文件 步骤2中的值。应用业务逻辑。然后写一张桌子。
  4. 我们正在使用Spring Data JPA,Spring集成。

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

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

    我知道如何独立实施上述步骤,但努力将它们从头到尾联系起来。

    分享任何想法来设计上述内容会很棒。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我会尝试为你的不同点提供一些想法。

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

传递

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

你可以做一个"手册"查询(即没有springbatch),然后执行业务逻辑以将结果作为JobParameters传递(您只需要JobLauncherCommandLineJobRunner,请参阅Springbatch Documentation §4.4):

JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
Job job = (Job) context.getBean(jobName);

// Do your business logic and your database query here.

// Create your parameters
JobParameter parameter = new JobParameter(resultOfQuery);

// Add them to a map
Map<String, JobParameter> parameters = new HashMap<String, JobParameter>();
parameters.add("yourParameter", parameter);

// Pass them to the job
JobParameters jobParameters = new JobParameters(parameters);
JobExecution execution = jobLauncher.run(job, parameters);

另一个解决方案是添加JobExecutionListener并覆盖方法beforeJob来执行查询,然后将结果保存在executionContext中(然后您可以使用以下方法访问#{jobExecutionContext[name]} {1}})。

@Override
public void beforeJob(JobExecution jobExecution) {

    // Do your business logic and your database query here.

    jobExecution.getExecutionContext().put(key, value);
}

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

<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 - 从文件阅读结果中读取表格的结果

没有&#34;默认&#34; CompositeItemReader允许您同时阅读2个来源,但我不认为这是您真正想要做的事情。

对于你的情况,我会声明&#34;表读者&#34;作为<batch:chunk>中的读者,然后声明另一个ItemProcessor字段的自定义ItemReader。这个读者将是你的FlatFileItemReader。然后,您可以手动启动读取并使用process方法应用业务逻辑。