From 59cf4f2ff40b69638af3e49b9f02099a4e33b1a1 Mon Sep 17 00:00:00 2001 From: Chandan Khandelwal Date: Tue, 12 May 2026 18:00:26 +0530 Subject: [PATCH] Modified reloadCrashedJobs to preserve tempExprId/recurrenceInfoId for SERVICE_RUNNING jobs if no child job exists. This ensures the recurrence chain is not broken after a server crash. --- .../org/apache/ofbiz/service/job/JobManager.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/framework/service/src/main/java/org/apache/ofbiz/service/job/JobManager.java b/framework/service/src/main/java/org/apache/ofbiz/service/job/JobManager.java index 768f2d52473..585f113f983 100644 --- a/framework/service/src/main/java/org/apache/ofbiz/service/job/JobManager.java +++ b/framework/service/src/main/java/org/apache/ofbiz/service/job/JobManager.java @@ -364,6 +364,18 @@ public synchronized void reloadCrashedJobs() { if ("SERVICE_QUEUED".equals(job.getString("statusId"))) { newJob.set("tempExprId", job.getString("tempExprId")); newJob.set("recurrenceInfoId", job.getString("recurrenceInfoId")); + } else if ("SERVICE_RUNNING".equals(job.getString("statusId"))) { + // If the job was running, check if a future recurrence was already scheduled + long childJobsCount = EntityQuery.use(delegator).from("JobSandbox") + .where("parentJobId", job.getString("jobId")) + .queryCount(); + if (childJobsCount == 0) { + newJob.set("tempExprId", job.getString("tempExprId")); + newJob.set("recurrenceInfoId", job.getString("recurrenceInfoId")); + } else { + newJob.set("tempExprId", null); + newJob.set("recurrenceInfoId", null); + } } else { //don't set a recurrent schedule on the new job, run it just one time newJob.set("tempExprId", null);