如何使用不同的作业参数 运行 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 可用于启动任意次数的任意作业。

希望对大家有帮助。