java - 手动更改 Spring Batch 元数据表是个坏主意吗?

标签 java spring-batch

背景

我正在使用 Spring Batch 2.1.8,并通过 CommandLineJobRunner 运行作业。如:

java org.springframework.batch.core.launch.support.CommandLineJobRunner classpath:launchContext.xml theJobId

问题

在某些情况下,例如服务器崩溃,正在运行的作业可能会中断。 但是被中断的作业在 Spring Batch 元数据表中留下了 STARTED 状态,并且无法再次运行。

org.springframework.batch.core.repository.JobExecutionAlreadyRunningException: A job execution for this job is already running

我可以想到两种解决方案:

解决方案1

添加一个新的作业参数并每次更改它以使其成为 Spring Batch 的"new"作业。如:

java org.springframework.batch.core.launch.support.CommandLineJobRunner classpath:launchContext.xml theJobId times=0

当需要重新运行时,清除所有相应的输出数据,统计一次times,然后重新运行作业。

解决方案2

手动更改 Spring Batch 元数据表。

更新状态以使作业可重新启动。如:

UPDATE BATCH_JOB_EXECUTION SET END_TIME = SYSTIMESTAMP, STATUS = 'FAILED', EXIT_CODE = 'FAILOVER' WHERE JOB_EXECUTION_ID =
    (SELECT MAX(JOB_EXECUTION_ID) FROM BATCH_JOB_EXECUTION WHERE JOB_INSTANCE_ID =
        (SELECT MAX(JOB_INSTANCE_ID) FROM BATCH_JOB_INSTANCE WHERE JOB_NAME = 'XXX'));

我试过了,效果不错。

问题

解决方案 2 是个坏主意吗?有没有陷阱?

提前致谢。并感谢任何其他解决方案。

最佳答案

解决方案 2 是目前公认的方法。 API 不提供解决此问题的方法。过去曾有人要求框架自动清理,但在 99% 的情况下,需要人工决定是否确实需要清理。

我对选项 2 的唯一注意事项是还要检查 BATCH_STEP_EXECUTION 表,以查看最后执行的步骤处于什么状态。

关于java - 手动更改 Spring Batch 元数据表是个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22775233/

相关文章:

java - 将包含十六进制 0x00 的字符串复制到剪贴板

java - 只有创建 View 层次结构的原始线程才能接触其 View 。在安卓上

java - 在复合构建中使用本地 gradle 插件,使用 groovy 约定脚本

java - 在运行时跟踪 java 应用程序

java - kubernetes 上的可扩展 spring 批处理作业

java - 排序时间差异

spring - 使用注释的多资源项读取器

Spring 批处理。如何限制 block 的执行次数

java - Spring 批处理管理。元表保持为空

Spring Boot Rest API + Spring Batch