Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions api/src/org/labkey/api/message/digest/MessageDigest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand Down Expand Up @@ -70,7 +71,7 @@ public void sendMessageDigest() throws Exception
AtomicReference<Exception> 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();
Expand All @@ -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)
{
Expand Down
4 changes: 3 additions & 1 deletion api/src/org/labkey/api/util/JobRunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -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()
{
Expand Down