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

Java 如何使用不同的作业参数多次运行spring批处理作业?,java,configuration,jboss7.x,spring-batch,Java,Configuration,Jboss7.x,Spring Batch,我们创建了一个简单的spring批处理作业,只需一步。有自定义实现的ItemReader和ItemWriter。ItemReader从作业参数获取初始数据。当作为独立java进程运行时,批处理可以完美地运行。但是我们想要的是将批处理托管在某个服务器上。因此,我们创建了REST服务来初始化批处理。服务调用作业URL并传递一些参数。此参数作为作业参数传递给批处理。当为一个参数调用服务和作业时,该服务和作业运行良好 但是,当我们多次调用该服务(出于测试目的调用两次)时,批处理的行为异常。我们正在传递不

我们创建了一个简单的spring批处理作业,只需一步。有自定义实现的ItemReader和ItemWriter。ItemReader从作业参数获取初始数据。当作为独立java进程运行时,批处理可以完美地运行。但是我们想要的是将批处理托管在某个服务器上。因此,我们创建了REST服务来初始化批处理。服务调用作业URL并传递一些参数。此参数作为作业参数传递给批处理。当为一个参数调用服务和作业时,该服务和作业运行良好

但是,当我们多次调用该服务(出于测试目的调用两次)时,批处理的行为异常。我们正在传递不同的作业参数。但是,当第二次作业初始化开始执行时,ItemReader接收到的作业参数值与第一次执行时的值相同。这两种执行方式相互干扰,共享数据库连接,干扰检索到的数据等

我们已尝试将可重启参数设置为false,但无效。我们还尝试了以下解决方案:

上述解决方案在JBoss中开始出现“中断尝试锁定”错误

在进一步的调查中,我们发现ItemReader只初始化了一次。这就是为什么它会得到相同的作业参数值,并且会干扰以前的执行

编辑
以下是作业配置:

<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
有人能提出一些解决办法吗?我是否缺少该步骤的一些配置?
提前感谢。

我发现,如果我们静态地创建上下文和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可以用于多次启动任何作业


我希望它能帮助其他人。

我发现,如果我们静态地创建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可以用于多次启动任何作业


我希望它能帮助别人。

1。你能提供你是如何开始这项工作的吗?2.你能提供你的工作配置吗?3.你看过Spring批量管理吗?它提供了一个REST服务,可以执行您正在尝试执行的操作…@MichaelMinella,我已经添加了启动作业的配置和代码。我知道这个问题有点老了,但您是否找到了解决此问题的方法?1。你能提供你是如何开始这项工作的吗?2.你能提供你的工作配置吗?3.你看过Spring批量管理吗?它提供了一个REST服务,可以完成你想要做的事情…@MichaelMinella,我已经添加了启动作业的配置和代码。我知道这个问题有点老了,但是你找到了解决这个问题的方法吗?