我需要为正在进行的其中一个项目实现一个ETL应用程序。
它有以下步骤:
我们正在使用Spring Data JPA,Spring集成。
我面临的挑战是从表中读取值以检索作业的参数然后启动作业。
然后必须将步骤2的输出与文件信息一起发送以进行进一步处理。
我知道如何独立实施上述步骤,但努力将它们从头到尾联系起来。
分享任何想法来设计上述内容会很棒。提前谢谢。
答案 0 :(得分:0)
我会尝试为你的不同点提供一些想法。
1 - 读取表格值并将其作为作业参数
传递我在这里看到两个解决方案:
你可以做一个"手册"查询(即没有springbatch),然后执行业务逻辑以将结果作为JobParameters传递(您只需要JobLauncher
或CommandLineJobRunner
,请参阅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
方法应用业务逻辑。