如何使用不同的作业参数 运行 spring 多次批处理作业?
How to run spring batch job multiple times with different job parameters?
我们创建了一个简单的 spring 单步批处理作业。有自定义实现的 ItemReader 和 ItemWriter。 ItemReader 从作业参数中获取初始数据。当 运行 作为独立的 java 进程时,批处理 运行 非常完美。但我们想要的是将批处理托管在某个服务器上。因此,我们创建了 REST 服务来初始化批处理。该服务调用作业 URL 并传递一些参数。此参数作为作业参数传递给批处理。服务和作业 运行 在调用一个参数时正常。
但是当我们多次调用该服务时(两次用于测试目的),批处理行为异常。我们正在传递不同的作业参数。但是当第二次作业初始化开始执行时,ItemReader接收到的作业参数值与第一次执行时相同。并且两者执行相互干扰,共享数据库连接,干扰数据检索等
我们已经尝试将 restartable 参数设置为 false,但没有成功。我们还尝试了以下解决方案:
Can we create multiple instances of a same java(spring) batch job?
上述解决方案开始在 JBoss 中给出 "Interrupted attempting lock" 错误。
经过进一步调查,我们发现 ItemReader 只被初始化了一次。这就是为什么它获得相同的作业参数值并干扰先前的执行。
编辑
以下是作业配置:
<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();
}
任何人都可以提出一些解决方案吗?我是否缺少该步骤的一些配置?
提前致谢。
我发现如果我们静态创建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 可用于启动任意次数的任意作业。
希望对大家有帮助。
我们创建了一个简单的 spring 单步批处理作业。有自定义实现的 ItemReader 和 ItemWriter。 ItemReader 从作业参数中获取初始数据。当 运行 作为独立的 java 进程时,批处理 运行 非常完美。但我们想要的是将批处理托管在某个服务器上。因此,我们创建了 REST 服务来初始化批处理。该服务调用作业 URL 并传递一些参数。此参数作为作业参数传递给批处理。服务和作业 运行 在调用一个参数时正常。
但是当我们多次调用该服务时(两次用于测试目的),批处理行为异常。我们正在传递不同的作业参数。但是当第二次作业初始化开始执行时,ItemReader接收到的作业参数值与第一次执行时相同。并且两者执行相互干扰,共享数据库连接,干扰数据检索等
我们已经尝试将 restartable 参数设置为 false,但没有成功。我们还尝试了以下解决方案:
Can we create multiple instances of a same java(spring) batch job?
上述解决方案开始在 JBoss 中给出 "Interrupted attempting lock" 错误。
经过进一步调查,我们发现 ItemReader 只被初始化了一次。这就是为什么它获得相同的作业参数值并干扰先前的执行。
编辑
以下是作业配置:
<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();
}
任何人都可以提出一些解决方案吗?我是否缺少该步骤的一些配置? 提前致谢。
我发现如果我们静态创建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 可用于启动任意次数的任意作业。
希望对大家有帮助。