如何使用不同的作业参数多次运行弹簧批处理作业?

时间:2015-07-09 09:43:16

标签: java configuration jboss7.x spring-batch

我们已经创建了一个单步的简单弹簧批处理作业。有自定义实现的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();
}

有人可以建议一些解决方案吗?我错过了一步的配置吗? 提前谢谢。

1 个答案:

答案 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可用于在任何时间启动任何作业。

我希望它可以帮助别人。