我们已经创建了一个单步的简单弹簧批处理作业。有自定义实现的ItemReader和ItemWriter。 ItemReader从job参数获取初始数据。当作为独立的java进程运行时,批处理运行完美。但我们想要的是在一些服务器上托管批处理。因此,我们已经创建了REST服务来初始化批处理。该服务调用作业URL并传递一些参数。此参数作为作业参数传递给批处理。调用一个参数时,服务和作业运行正常。
但是当我们不止一次调用该服务(两次用于测试目的)时,批处理行为奇怪。我们正在传递不同的工作参数。但是当第二个作业初始化开始执行时,ItemReader接收的作业参数值与第一次执行的作业参数值相同。并且两个执行都相互干扰,共享数据库连接,干扰检索的数据等。
我们已尝试将restartable参数设置为false但它不起作用。我们还尝试了以下解决方案:
Can we create multiple instances of a same java(spring) batch job?
上述解决方案开始提供"中断尝试锁定" JBoss中的错误。
在进一步调查中,我们发现ItemReader只被初始化了一次。这就是为什么它获得相同的作业参数值并干扰先前的执行。
EDIT
以下是作业配置:
<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
<job id="jobid" restartable="false">
<step id="step1">
<tasklet>
<chunk reader="reader" writer="writer"
commit-interval="2">
</chunk>
</tasklet>
</step>
</job>
以下是启动作业的代码段:
JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher");
Job job = (Job) context.getBean("jobid");
try {
JobParameters param = new JobParametersBuilder().addString("key","value").toJobParameters();
JobExecution execution = jobLauncher.run(job, param);
} catch (Exception e) {
e.printStackTrace();
}
有人可以建议一些解决方案吗?我错过了一步的配置吗? 提前谢谢。
答案 0 :(得分:0)
我发现如果我们静态地创建Context和JobLauncher对象,也就是说,如果这两个对象只有一个实例,那么上面的东西就可以工作了。通过这种方式,我们可以多次启动相同的作业,但参数不同。
Class MyClass{
private static ConfigurableApplicationContext context = null;
private static JobLauncher jobLauncher = null;
static{
String[] springConfig = {BatchTokeniserConstants.SPRING_CONFIG_FILE_NAME};
try {
context = new ClassPathXmlApplicationContext(springConfig);
jobLauncher = (JobLauncher) context.getBean("jobLauncher");
BatchTokeniserUtils.loadSystemVaiables();
} catch (BeansException e) {
}
}
}
现在,jobLauncher可用于在任何时间启动任何作业。
我希望它可以帮助别人。