diff --git a/proxy/src/main/java/com/velocitypowered/proxy/plugin/loader/VelocityPluginContainer.java b/proxy/src/main/java/com/velocitypowered/proxy/plugin/loader/VelocityPluginContainer.java index 40b00df7..5e757708 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/plugin/loader/VelocityPluginContainer.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/plugin/loader/VelocityPluginContainer.java @@ -71,4 +71,8 @@ public class VelocityPluginContainer implements PluginContainer { return this.service; } + + public boolean hasExecutorService() { + return this.service != null; + } } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/scheduler/VelocityScheduler.java b/proxy/src/main/java/com/velocitypowered/proxy/scheduler/VelocityScheduler.java index 96d0b94d..727832bd 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/scheduler/VelocityScheduler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/scheduler/VelocityScheduler.java @@ -30,9 +30,12 @@ import com.velocitypowered.api.scheduler.ScheduledTask; import com.velocitypowered.api.scheduler.Scheduler; import com.velocitypowered.api.scheduler.TaskStatus; import com.velocitypowered.proxy.plugin.loader.VelocityPluginContainer; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.IdentityHashMap; +import java.util.Iterator; +import java.util.List; import java.util.Optional; import java.util.Set; import java.util.concurrent.ExecutionException; @@ -116,17 +119,24 @@ public class VelocityScheduler implements Scheduler { task.cancel(); } timerExecutionService.shutdown(); - for (final PluginContainer container : this.pluginManager.getPlugins()) { + final List plugins = new ArrayList<>(this.pluginManager.getPlugins()); + final Iterator pluginIterator = plugins.iterator(); + while (pluginIterator.hasNext()) { + final PluginContainer container = pluginIterator.next(); if (container instanceof VelocityPluginContainer) { - (container).getExecutorService().shutdown(); + final VelocityPluginContainer pluginContainer = (VelocityPluginContainer) container; + if (pluginContainer.hasExecutorService()) { + container.getExecutorService().shutdown(); + } else { + pluginIterator.remove(); + } + } else { + pluginIterator.remove(); } } boolean allShutdown = true; - for (final PluginContainer container : this.pluginManager.getPlugins()) { - if (!(container instanceof VelocityPluginContainer)) { - continue; - } + for (final PluginContainer container : plugins) { final String id = container.getDescription().getId(); final ExecutorService service = (container).getExecutorService();