BatchJob - 服务器停止时 BatchJob 仍在运行

问题描述 投票:0回答:2

当BJ当前正在RUNNING时,如果服务器已停止,即使在服务器停止后,Spring Batch Admin中的BATCH JOB状态仍然显示其RUNNING,需要为FAILED

请帮忙解决这个问题?我们是否需要手动处理它,或者我们可以开箱即用。 在这方面需要帮助吗?

spring spring-batch spring-batch-admin
2个回答
1
投票

作业存储库(数据库实现)反映了最后的“已知”状态。因此,在作业正在运行且 JVM 崩溃的情况下,它将永远不会在数据库中更新。

如果数据库与 JVM“不同步”,则该过程需要手动进行,似乎没有开箱即用的解决方案。最简单的解决方案是在启动时执行一个脚本,该脚本检查批处理表中是否有任何正在运行的作业,然后将其“失败”。

update batch_job_execution set STATUS = 'FAILED', EXIT_CODE = 'FAILED', EXIT_MESSAGE = 'FORCED UPDATE' where job_execution_id in (select job_execution_id from batch_job_execution where status = 'RUNNING');

在这种情况下,您需要考虑的一件事是,JobRepository 表以及与之关联的作业是否与另一个 JVM 共享。在这种情况下,您可能希望执行一个传递,该传递还可以评估作业是否仍在运行,超过它拥有的任何历史记录的最大运行时间。 (具有 max() end_time 的子选择 - 相同 job_name 的 create_time)


0
投票

更新失败状态的批处理表以继续前进

-- batch_step_execution

UPDATE batch_step_execution
SET
    end_time = sysdate,
    last_updated = sysdate,
    status = 'COMPLETED',
    exit_code = 'FAILED'
WHERE
    step_execution_id IN (
        SELECT
            step_execution_id
        FROM
            batch_step_execution bse
        WHERE
                1 = 1
            AND status NOT IN ( 'COMPLETED', 'FAILED' )
            OR exit_code NOT IN ( 'COMPLETED', 'FAILED' )
    );

-- batch_job_execution

UPDATE batch_job_execution
SET
    end_time = sysdate,
    last_updated = sysdate,
    status = 'COMPLETED',
    exit_code = 'FAILED'
WHERE
    job_execution_id IN (
        SELECT
            bje.job_execution_id
        FROM
            batch_job_execution bje
        WHERE
                1 = 1
            AND ( status NOT IN ( 'COMPLETED', 'FAILED' ) )
            OR ( exit_code NOT IN ( 'COMPLETED', 'FAILED' ) )
    );
© www.soinside.com 2019 - 2024. All rights reserved.