X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Frhynodge%2Fengine%2FEngine.java;h=e132b0884017c18e07052fc47fa80257e73b9980;hb=8aeef90590095a455e2323d70ba8ccae032f4276;hp=7103dc58a1b91a2a940785d0a0fd13fc3caa3bc8;hpb=c3d1babcce7f077c2b57376fa7f9712b921950d8;p=rhynodge.git diff --git a/src/main/java/net/pterodactylus/rhynodge/engine/Engine.java b/src/main/java/net/pterodactylus/rhynodge/engine/Engine.java index 7103dc5..e132b08 100644 --- a/src/main/java/net/pterodactylus/rhynodge/engine/Engine.java +++ b/src/main/java/net/pterodactylus/rhynodge/engine/Engine.java @@ -17,26 +17,30 @@ package net.pterodactylus.rhynodge.engine; -import static java.lang.System.currentTimeMillis; -import static java.util.concurrent.TimeUnit.MILLISECONDS; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; +import kotlin.Unit; +import kotlin.jvm.functions.Function0; +import kotlin.jvm.functions.Function1; +import net.pterodactylus.rhynodge.Reaction; +import net.pterodactylus.rhynodge.actions.EmailAction; +import net.pterodactylus.rhynodge.states.StateManager; +import org.apache.log4j.Logger; import java.util.Map; import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Future; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.*; -import net.pterodactylus.rhynodge.Reaction; -import net.pterodactylus.rhynodge.actions.EmailAction; -import net.pterodactylus.rhynodge.states.StateManager; +import static java.lang.System.currentTimeMillis; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static net.pterodactylus.util.exception.ExceptionsKt.suppressException; /** * Rhynodge main engine. * * @author David ‘Bombe’ Roden */ +@Singleton public class Engine { private final StateManager stateManager; @@ -44,10 +48,11 @@ public class Engine { private final Map> scheduledFutures = new ConcurrentHashMap<>(); private final EmailAction errorEmailAction; + @Inject public Engine(StateManager stateManager, EmailAction errorEmailAction) { this.stateManager = stateManager; this.errorEmailAction = errorEmailAction; - executorService = new ScheduledThreadPoolExecutor(10); + executorService = new ScheduledThreadPoolExecutor(1); } // @@ -68,10 +73,24 @@ public class Engine { long lastExecutionTime = lastState.map(net.pterodactylus.rhynodge.State::time).orElse(0L); long nextExecutionTime = lastExecutionTime + reaction.updateInterval(); ReactionRunner reactionRunner = new ReactionRunner(reaction, reactionState, errorEmailAction); - ScheduledFuture future = executorService.scheduleWithFixedDelay(reactionRunner, nextExecutionTime - currentTimeMillis(), reaction.updateInterval(), MILLISECONDS); + ScheduledFuture future = executorService.scheduleWithFixedDelay(suppressException(wrapRunnable(reactionRunner), logExceptionForReaction(reaction))::invoke, nextExecutionTime - currentTimeMillis(), reaction.updateInterval(), MILLISECONDS); scheduledFutures.put(name, future); } + private Function1 logExceptionForReaction(Reaction reaction) { + return (Exception e) -> { + logger.warn("Exception during Reaction “%s”!".formatted(reaction.name()), e); + return Unit.INSTANCE; + }; + } + + private Function0 wrapRunnable(Runnable runnable) { + return () -> { + runnable.run(); + return Unit.INSTANCE; + }; + } + /** * Removes the reaction with the given name. * @@ -85,4 +104,6 @@ public class Engine { scheduledFutures.remove(name).cancel(true); } + private static final Logger logger = Logger.getLogger(Engine.class); + }