From 95c21590f91f40425bec772b48c4766a6535390a Mon Sep 17 00:00:00 2001 From: labkey-jeckels Date: Sun, 30 Aug 2026 08:41:13 -0700 Subject: [PATCH] Wait for the job, not the whole queue --- api/src/org/labkey/api/message/digest/MessageDigest.java | 6 ++++-- api/src/org/labkey/api/util/JobRunner.java | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/api/src/org/labkey/api/message/digest/MessageDigest.java b/api/src/org/labkey/api/message/digest/MessageDigest.java index 3e446d40dc9..46f50eac7ff 100644 --- a/api/src/org/labkey/api/message/digest/MessageDigest.java +++ b/api/src/org/labkey/api/message/digest/MessageDigest.java @@ -35,6 +35,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicReference; /** @@ -70,7 +71,7 @@ public void sendMessageDigest() throws Exception AtomicReference ref = new AtomicReference<>(); // Issue 45978: Run in a background thread to better simulate being triggered by a timer - JobRunner.getDefault().execute(() -> { + Future future = JobRunner.getDefault().execute(() -> { try { Date prev = getLastSuccessful(); @@ -92,7 +93,8 @@ public void sendMessageDigest() throws Exception } }, 0); - JobRunner.getDefault().waitForCompletion(); + // Don't use JobRunner.waitForCompletion(); it blocks on every job queued on the shared default runner, including SimpleMetricsService's save, which is submitted with a 15 minute delay. + future.get(); if (ref.get() != null) { diff --git a/api/src/org/labkey/api/util/JobRunner.java b/api/src/org/labkey/api/util/JobRunner.java index dae76bb6448..137c588268b 100644 --- a/api/src/org/labkey/api/util/JobRunner.java +++ b/api/src/org/labkey/api/util/JobRunner.java @@ -98,7 +98,9 @@ public static JobRunner getDefault() } /** - * Waits for all submitted jobs to complete. Does not require shutdown. + * Waits for all submitted jobs to complete. Jobs can be scheduled in the future, so this can be a long wait. + * Does not require shutdown. + * Callers should prefer using Future.get() from the result of JobRunner.execute(). */ public void waitForCompletion() {