From 770469b999a8afb911ba6050c7f98d467b98d45d Mon Sep 17 00:00:00 2001 From: bigfoot547 Date: Mon, 1 Sep 2025 16:11:14 -0500 Subject: better exception handling for tasks --- core/src/main/java/dev/figboot/launcher/core/Launcher.java | 8 +++----- .../dev/figboot/launcher/core/LauncherInterfaceAccess.java | 2 +- .../figboot/launcher/core/task/LauncherExecutorService.java | 8 +++++--- core/src/main/java/dev/figboot/launcher/core/task/Task.java | 1 + .../figboot/launcher/core/task/TaskConsumingCallable.java | 8 ++++++++ .../figboot/launcher/core/task/TaskConsumingRunnable.java | 8 ++++++++ .../main/java/dev/figboot/launcher/core/task/TaskUtil.java | 12 ++++++++++-- 7 files changed, 36 insertions(+), 11 deletions(-) (limited to 'core/src/main/java/dev/figboot') diff --git a/core/src/main/java/dev/figboot/launcher/core/Launcher.java b/core/src/main/java/dev/figboot/launcher/core/Launcher.java index d6c7758..bc5b74e 100644 --- a/core/src/main/java/dev/figboot/launcher/core/Launcher.java +++ b/core/src/main/java/dev/figboot/launcher/core/Launcher.java @@ -5,7 +5,7 @@ import dev.figboot.launcher.core.task.TaskUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.IOException; +import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; public class Launcher { @@ -19,9 +19,7 @@ public class Launcher { service = new LauncherExecutorService(iface); } - public void loadVersions() throws IOException { - service.execute(TaskUtil.taskRunnable((task) -> { - task.setLabel("sussy"); - })); + public Future loadVersions() { + return service.submit(TaskUtil.taskRunnable((task) -> task.setLabel("sussy"))); } } diff --git a/core/src/main/java/dev/figboot/launcher/core/LauncherInterfaceAccess.java b/core/src/main/java/dev/figboot/launcher/core/LauncherInterfaceAccess.java index fc97d92..6e7d20f 100644 --- a/core/src/main/java/dev/figboot/launcher/core/LauncherInterfaceAccess.java +++ b/core/src/main/java/dev/figboot/launcher/core/LauncherInterfaceAccess.java @@ -3,5 +3,5 @@ package dev.figboot.launcher.core; import dev.figboot.launcher.core.task.Task; public interface LauncherInterfaceAccess { - Task createTask(String label); + Task createTask(/* nullable */ String label); } diff --git a/core/src/main/java/dev/figboot/launcher/core/task/LauncherExecutorService.java b/core/src/main/java/dev/figboot/launcher/core/task/LauncherExecutorService.java index 81d9768..6c7f2be 100644 --- a/core/src/main/java/dev/figboot/launcher/core/task/LauncherExecutorService.java +++ b/core/src/main/java/dev/figboot/launcher/core/task/LauncherExecutorService.java @@ -17,7 +17,8 @@ public class LauncherExecutorService extends ScheduledThreadPoolExecutor { @Override protected RunnableScheduledFuture decorateTask(Runnable runnable, RunnableScheduledFuture task) { if (runnable instanceof TaskConsumingRunnable) { - ((TaskConsumingRunnable)runnable).consumeTask(iface.createTask(null)); + TaskConsumingRunnable tcr = (TaskConsumingRunnable)runnable; + tcr.consumeTask(iface.createTask(tcr.initialLabel)); } return task; @@ -26,9 +27,10 @@ public class LauncherExecutorService extends ScheduledThreadPoolExecutor { @Override protected RunnableScheduledFuture decorateTask(Callable callable, RunnableScheduledFuture task) { if (callable instanceof TaskConsumingCallable) { - ((TaskConsumingCallable)callable).consumeTask(iface.createTask(null)); + TaskConsumingCallable tcc = (TaskConsumingCallable)callable; + tcc.consumeTask(iface.createTask(tcc.initialLabel)); } - return super.decorateTask(callable, task); + return task; } } diff --git a/core/src/main/java/dev/figboot/launcher/core/task/Task.java b/core/src/main/java/dev/figboot/launcher/core/task/Task.java index de025c1..57423d1 100644 --- a/core/src/main/java/dev/figboot/launcher/core/task/Task.java +++ b/core/src/main/java/dev/figboot/launcher/core/task/Task.java @@ -2,5 +2,6 @@ package dev.figboot.launcher.core.task; public interface Task { void setLabel(String label); + void unhandled(Throwable t); void complete(); } diff --git a/core/src/main/java/dev/figboot/launcher/core/task/TaskConsumingCallable.java b/core/src/main/java/dev/figboot/launcher/core/task/TaskConsumingCallable.java index 3080bfc..4835105 100644 --- a/core/src/main/java/dev/figboot/launcher/core/task/TaskConsumingCallable.java +++ b/core/src/main/java/dev/figboot/launcher/core/task/TaskConsumingCallable.java @@ -7,6 +7,7 @@ import java.util.concurrent.Callable; @RequiredArgsConstructor(access = AccessLevel.PACKAGE) class TaskConsumingCallable implements Callable { + final String initialLabel; private final TaskCallable delegate; private Task task = null; @@ -23,6 +24,13 @@ class TaskConsumingCallable implements Callable { try { return delegate.call(task); + } catch (Throwable t) { + try { + task.unhandled(t); + } catch (Throwable t1) { + t.addSuppressed(t1); + } + throw t; } finally { task.complete(); } diff --git a/core/src/main/java/dev/figboot/launcher/core/task/TaskConsumingRunnable.java b/core/src/main/java/dev/figboot/launcher/core/task/TaskConsumingRunnable.java index 63464e1..46824c5 100644 --- a/core/src/main/java/dev/figboot/launcher/core/task/TaskConsumingRunnable.java +++ b/core/src/main/java/dev/figboot/launcher/core/task/TaskConsumingRunnable.java @@ -7,6 +7,7 @@ import java.util.function.Consumer; @RequiredArgsConstructor(access = AccessLevel.PACKAGE) class TaskConsumingRunnable implements Runnable { + final String initialLabel; private final Consumer delegate; private Task task; @@ -23,6 +24,13 @@ class TaskConsumingRunnable implements Runnable { try { delegate.accept(task); + } catch (Throwable t) { + try { + task.unhandled(t); + } catch (Throwable t1) { + t.addSuppressed(t1); + } + throw t; } finally { task.complete(); } diff --git a/core/src/main/java/dev/figboot/launcher/core/task/TaskUtil.java b/core/src/main/java/dev/figboot/launcher/core/task/TaskUtil.java index ffa0f9a..773bd06 100644 --- a/core/src/main/java/dev/figboot/launcher/core/task/TaskUtil.java +++ b/core/src/main/java/dev/figboot/launcher/core/task/TaskUtil.java @@ -6,11 +6,19 @@ import java.util.function.Consumer; public final class TaskUtil { private TaskUtil() { } + public static Runnable taskRunnable(String label, Consumer command) { + return new TaskConsumingRunnable(label, command); + } + public static Runnable taskRunnable(Consumer command) { - return new TaskConsumingRunnable(command); + return taskRunnable(null, command); + } + + public static Callable taskCallable(String label, TaskCallable callable) { + return new TaskConsumingCallable<>(label, callable); } public static Callable taskCallable(TaskCallable callable) { - return new TaskConsumingCallable<>(callable); + return taskCallable(null, callable); } } -- cgit v1.2.3-70-g09d2