fix(EventExecutor, ModuleExecutorImpl): implement DisposableBean interface and manage executor shutdown

This commit is contained in:
extio-de
2026-10-04 17:40:16 +02:00
parent 926c6565b6
commit 5c68c7e9af
2 changed files with 21 additions and 7 deletions

View File

@@ -12,15 +12,16 @@ import java.util.function.Consumer;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
public class EventExecutor { public class EventExecutor implements DisposableBean {
private static final Logger LOGGER = LoggerFactory.getLogger(EventExecutor.class); private static final Logger LOGGER = LoggerFactory.getLogger(EventExecutor.class);
private static final ExecutorService EXECUTOR = Executors.newVirtualThreadPerTaskExecutor();
private final ExecutorService executor = Executors.newFixedThreadPool(4); //Executors.newVirtualThreadPerTaskExecutor();
private final BlockingQueue<QueuedEvent> eventQueue = new LinkedBlockingQueue<>(); private final BlockingQueue<QueuedEvent> eventQueue = new LinkedBlockingQueue<>();
@SuppressWarnings("unused")
private final Thread processorThread; private final Thread processorThread;
private final EventHandlerRegistry registry; private final EventHandlerRegistry registry;
@@ -44,6 +45,12 @@ public class EventExecutor {
} }
}); });
} }
@Override
public void destroy() throws Exception {
this.processorThread.interrupt();
this.executor.shutdownNow();
}
public void submit(final Event event) { public void submit(final Event event) {
this.eventQueue.offer(new QueuedEvent(event.getClass(), event)); this.eventQueue.offer(new QueuedEvent(event.getClass(), event));
@@ -79,7 +86,7 @@ public class EventExecutor {
}); });
} }
try { try {
for (final var future : EXECUTOR.invokeAll(tasks)) { for (final var future : executor.invokeAll(tasks)) {
try { try {
future.get(); future.get();
} }

View File

@@ -10,17 +10,24 @@ import java.util.function.Function;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
public class ModuleExecutorImpl implements ModuleExecutor { public class ModuleExecutorImpl implements ModuleExecutor, DisposableBean {
private static final Logger LOGGER = LoggerFactory.getLogger(ModuleExecutorImpl.class); private static final Logger LOGGER = LoggerFactory.getLogger(ModuleExecutorImpl.class);
private static final ExecutorService EXECUTOR = Executors.newVirtualThreadPerTaskExecutor();
private final ExecutorService executor = Executors.newFixedThreadPool(4); // Executors.newVirtualThreadPerTaskExecutor();
private final ModuleService moduleManager; private final ModuleService moduleManager;
public ModuleExecutorImpl(final ModuleService moduleManager) { public ModuleExecutorImpl(final ModuleService moduleManager) {
this.moduleManager = moduleManager; this.moduleManager = moduleManager;
} }
@Override
public void destroy() throws Exception {
this.executor.shutdownNow();
}
@Override @Override
public void execute() { public void execute() {
@@ -72,7 +79,7 @@ public class ModuleExecutorImpl implements ModuleExecutor {
} }
try { try {
EXECUTOR.invokeAll(tasks); executor.invokeAll(tasks);
} }
catch (final InterruptedException e) { catch (final InterruptedException e) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();