作业参数正在缓存

时间:2015-12-08 15:01:57

标签: java spring spring-batch

  

块引用

我在spring batch中遇到了jobParameters的问题。我有一个jobParameter是可选的。我第一次通过commandLineJobRunner传递job参数时它正在工作。第二次我没有传递任何jobParameter但仍然这是采取以前的jobParameter。当我清除我的元数据然后jobParameter来了null我没有通过。我怎么能解决这个问题而不清除Meta NORM。这通常发生在春季批次

已编辑的代码

我正在使用MapJobRegistry,并在启动作业时使用next。当我调试时,我观察到要增加run.id,它正在加载所有以前的参数

public JobParameters More ...getNext(JobParameters parameters) {
        if (parameters == null) {
            parameters = new JobParameters();
        }
        long id = parameters.getLong(key, 0L) + 1;
        return new JobParametersBuilder(parameters).addLong(key, id).toJobParameters();
    }

1 个答案:

答案 0 :(得分:0)

首先要提到的是,您不应该使用所有Map ...类。它们不是用于生产的,因此,您最好使用不同的Jdbc实现。如果您不想使用真正的数据库,则可以始终使用内存数据库。

但关于你的初步问题: 您正在使用CommandLineJobRunner与“next”选项一起使用。 看一下方法CommandLineJobRunner.start(),你会发现以下几行:

if (opts.contains("-next")) {
    JobParameters nextParameters = getNextJobParameters(job);
    Map<String, JobParameter> map = new HashMap<String, JobParameter>(nextParameters.getParameters());
    map.putAll(jobParameters.getParameters());
    jobParameters = new JobParameters(map);
}

您可以看到调用了getNextJobParameters。在此方法中,您可以看到上一次运行的数据已加载'jobExplorer.getJobInstances(jobIdentifier,0,1);' (如果有以前的运行)。如果存在先前的运行,则在应用incrementmenter.next方法后返回该旧运行的作业参数 - &gt;因此,这就是你得到旧参数的原因。

现在,这是技术解释,但接下来的问题是你应该如何使用“下一步”和“重启”选项来获得你想要的东西。

使用下一个: - 如果您启动具有相同名称和相同作业参数的作业,则下一步仅按预期工作。否则结果可能会令人困惑。实际上,我只使用内部单元和集成测试

使用重启: - 如果具有相同作业名称的先前作业执行失败,则可以使用“重新启动”。此外,工作参数将从您之前的发布中获取。

对于正常的作业启动,您不应该使用next也不应该重启。正常的工作开始应始终具有唯一的工作参数。例如,一个“runid”,其值随着每次作业的开始而改变。 (否则,你会得到JobInstanceAlready ...... Exception)。

在单元测试的情况下,我为每个测试用例使用唯一的“runId”。在这里,我正在使用“下一个”选项。