Ric*_*hie 5 spring spring-batch
我有一个春季批处理工作,我想做以下事情...
Step 1 -
Tasklet - Create a list of dates, store the list of dates in the job execution context.
Step 2 -
JDBC Item Reader - Get list of dates from job execution context.
Get element(0) in dates list. Use is as input for jdbc query.
Store element(0) date is job execution context
Remove element(0) date from list of dates
Store element(0) date in job execution context
Flat File Item Writer - Get element(0) date from job execution context and use for file name.
Then using a job listener repeat step 2 until no remaining dates in the list of dates.
Run Code Online (Sandbox Code Playgroud)
我已经创建了作业,并且可以在步骤2的第一次执行中正常工作。但是步骤2并没有重复执行。我知道这是因为,当我调试代码时,它只会在步骤2的初始运行中中断。
但是,即使我知道不是,它仍继续向我发出如下消息,好像它正在运行步骤2。
2016-08-10 22:20:57.842 INFO 11784 --- [ main] o.s.batch.core.job.SimpleStepHandler : Duplicate step [readStgDbAndExportMasterListStep] detected in execution of job=[exportMasterListCsv]. If either step fails, both will be executed again on restart.
2016-08-10 22:20:57.846 INFO 11784 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [readStgDbAndExportMasterListStep]
Run Code Online (Sandbox Code Playgroud)
这最终以永无止境的循环结束。
有人可以帮我弄清楚还是对我的stpe 2为什么只运行一次提出建议?
提前致谢
我为我的代码添加了两个指向PasteBin的链接,以免污染这篇文章。
http://pastebin.com/QhExNikm(作业配置)
http://pastebin.com/sscKKWRk(通用作业配置)
http://pastebin.com/Nn74zTpS(步骤执行监听器)
根据我们对Spring 批处理在 tasklet 中执行动态生成的步骤的讨论,我试图回答有关如何在作业实际执行之前访问 jobParameter 的问题。
我假设有一个将执行批处理的restcall。一般来说,这需要采取以下步骤。1. 一段接收剩余调用及其参数的代码 2. 创建一个新的 springcontext(有多种方法可以重用现有上下文并再次启动作业,但是在重用步骤、读取器和作家)3.启动工作
最简单的解决方案是将从服务接收到的作业参数存储为系统属性,然后在步骤 3 中构建作业时访问此属性。但是,如果多个用户在同一位置启动作业,这可能会导致问题同一个时刻。
当 springcontext 加载时,还有其他方法可以将参数传递到其中。但这取决于您设置上下文的方式。例如,如果您直接使用 SpringBoot 进行步骤 2,则可以编写如下方法:
private int startJob(Properties jobParamsAsProps) {
SpringApplication springApp = new SpringApplication(.. my config classes ..);
springApp.setDefaultProperties(jobParamsAsProps);
ConfigurableApplicationContext context = springApp.run();
ExitCodeGenerator exitCodeGen = context.getBean(ExitCodeGenerator.class);
int code = exitCodeGen.getExitCode();
context.close();
return cod;
}
Run Code Online (Sandbox Code Playgroud)
这样,您就可以使用标准 Value- 或 ConfigurationProperties 注释正常访问属性。
| 归档时间: |
|
| 查看次数: |
3933 次 |
| 最近记录: |