块引用
我在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();
}
答案 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”。在这里,我正在使用“下一个”选项。