【问题标题】:Job parameters are getting cached作业参数被缓存
【发布时间】:2015-12-08 15:01:56
【问题描述】:

块引用

我在 Spring Batch 中遇到了 jobParameters 的问题。我有一个可选的 jobParameter。当我第一次通过 commandLineJobRunner 传递作业参数时它正在工作。第二次我没有传递任何 jobParameter 但仍然它正在使用以前的作业参数。当我清除我的元数据时,作业参数将作为空值出现,我没有通过。如何在不清除元数据的情况下解决这个问题。这在春季批处理中是否正常发生

修改后的代码

我正在使用 MapJobRegistry 并在启动作业时使用下一个。当我调试时,我观察到增加 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();
    }

【问题讨论】:

  • 您是否在使用 SpringBoot,您的作业是否通过 'org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner' 执行?
  • 不,我正在通过 commandLineJobRunner 启动我的工作。我没有使用 spring boot @HansjoergWingeier
  • 您使用的是 JdbcJobRegistery 还是 MapJobRegistery?启动时是否使用“下一个”或“重新启动”选项?我认为对你来说最好的办法是在 CommandLineJobRunner.start 中设置一个断点并检查你的 JobParameters 更改的时间和原因。

标签: java spring spring-batch


【解决方案1】:

首先要提到的是,您不应该使用所有 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);' (如果有以前的运行)。如果有先前的运行,则在应用 incrementer.next 方法后返回此旧运行的作业参数 -> 因此,这就是您获取旧参数的原因。

现在,这是技术解释,但接下来的问题是您应该如何使用“下一步”和“重新启动”选项来获得所需的内容。

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

使用重启: - 如果先前具有相同作业名的作业执行失败,您可以使用“重新启动”。同样在这里,作业参数将取自您之前的发布。

要正常启动作业,您不应使用 next 或 restart。一个正常的工作开始应该总是有一个唯一的工作参数。例如,一个“runid”,其值随着作业的每次启动而改变。 (否则,您会得到 JobInstanceAlready... 异常)。

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

【讨论】:

  • JobRegistry 是否有任何 JDBC impl 可用。如果我第一次不使用 next 来启动我的工作,它会按预期工作。但第二次工作没有开始
  • JDBC 与地图注册表:谷歌或看这里examples.javacodegeeks.com/enterprise-java/spring/…
  • 为什么第二次启动作业没有成功?你有例外吗?您是否使用了具有新唯一值的参数?
  • 我在没有下一个的情况下开始了我的第一份工作,它运行良好,但元表没有填充工作详细信息。当我第二次使用不同的参数运行时,工作没有启动。没有例外。
猜你喜欢
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
相关资源
最近更新 更多