我写了两个步骤的作业,其中两个步骤之一是分区步骤.分区步骤使用TaskExecutorPartitionHandler并在线程中运行5个从属步骤.该作业在main()方法中启动.但是在每个从属ItemReader返回null(结束符号)之后它不会停止.即使程序运行了main()方法中的最后一行代码(即System.out.println("Finished")),程序进程也不会停止,挂在内存中,什么也不做.我必须按下Eclipse面板上的停止按钮才能停止程序.
以下是JobLauncher.run()返回的JobExecution的内容,表示作业运行的成功状态.
JobExecution:id = 0,version = 2,startTime = Fri Nov 27 06:05:23 CST 2015,endTime = Fri Nov 27 06:05:39 CST 2015,lastUpdated = Fri Nov 27 06:05:39 CST 2015,status = COMPLETED,exitStatus = exitCode = COMPLETED; exitDescription =,job = [JobInstance:id = 0,version = 0,Job = [jobCensoredPages]],jobParameters = [{}]
7217
完了
为什么运行成功的Spring Batch程序仍然挂起?请指出我在哪里工作.我怀疑Spring Batch管理的多线程部分没有停止..
简单的工作运行代码
Job job = (Job) context.getBean("jobPages");
try {
JobParameters p=new JobParametersBuilder()
.toJobParameters();
JobExecution result = launcher.run(job, new JobParameters());
System.out.println(result.toString());
} catch (Exception e) {
e.printStackTrace();
}
context.getBean("idSet");
AtomicInteger n=(AtomicInteger) …Run Code Online (Sandbox Code Playgroud) 我已经使用 SpringBatch 几个月了。我曾经将与执行相关的变量(如页数、项目数、批次的当前位置等)存储到 Bean 中。然后,通过使用, -setter 和 getter将这些 Bean 安装到ItemReader,上。这些 bean 还通过手动同步在线程之间共享。ItemProcessorItemWritersetVar()getVar()
但现在我发现这可能是执行批处理作业的错误方法。安装的 BeanItemReaders无法持久化JobRepository,因此无法记录作业停止和重新启动的状态。所以我还是需要回去使用StepExecution/ JobExecution。我在网上找到的那些例子都是基于 XML 配置,或者是更糟糕的 SpEL 自动连接到 setter 方法。
我纯粹使用 Java Config..是否有 Java 配置或面向 Java 代码的访问方式StepExecution?访问各种类型的最佳实践是什么ExecutionContext?