diff --git a/core/src/main/java/org/geysermc/floodgate/api/SimpleFloodgateApi.java b/core/src/main/java/org/geysermc/floodgate/api/SimpleFloodgateApi.java index 0309eb2d..5ef49e46 100644 --- a/core/src/main/java/org/geysermc/floodgate/api/SimpleFloodgateApi.java +++ b/core/src/main/java/org/geysermc/floodgate/api/SimpleFloodgateApi.java @@ -32,10 +32,10 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.inject.Inject; import java.util.Collection; -import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import org.geysermc.cumulus.form.Form; import org.geysermc.cumulus.form.util.FormBuilder; @@ -51,7 +51,7 @@ import org.geysermc.floodgate.util.HttpClient; import org.geysermc.floodgate.util.Utils; public class SimpleFloodgateApi implements FloodgateApi { - private final Map players = new HashMap<>(); + private final Map players = new ConcurrentHashMap<>(); private final Cache pendingRemove = CacheBuilder.newBuilder() .expireAfterWrite(20, TimeUnit.SECONDS) diff --git a/core/src/main/java/org/geysermc/floodgate/module/CommonModule.java b/core/src/main/java/org/geysermc/floodgate/module/CommonModule.java index 500cad26..ff45c89d 100644 --- a/core/src/main/java/org/geysermc/floodgate/module/CommonModule.java +++ b/core/src/main/java/org/geysermc/floodgate/module/CommonModule.java @@ -38,6 +38,7 @@ import io.netty.util.AttributeKey; import java.nio.file.Path; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; import lombok.RequiredArgsConstructor; import org.geysermc.event.PostOrder; import org.geysermc.floodgate.addon.data.HandshakeHandlersImpl; @@ -87,8 +88,19 @@ public class CommonModule extends AbstractModule { }); ExecutorService commonPool = Executors.newCachedThreadPool(); - eventBus.subscribe(ShutdownEvent.class, ignored -> commonPool.shutdown(), PostOrder.LAST); - bind(ExecutorService.class).annotatedWith(Names.named("commonPool")).toInstance(commonPool); + ScheduledExecutorService commonScheduledPool = Executors.newSingleThreadScheduledExecutor(); + + eventBus.subscribe(ShutdownEvent.class, ignored -> { + commonPool.shutdown(); + commonScheduledPool.shutdown(); + }, PostOrder.LAST); + + bind(ExecutorService.class) + .annotatedWith(Names.named("commonPool")) + .toInstance(commonPool); + bind(ScheduledExecutorService.class) + .annotatedWith(Names.named("commonScheduledPool")) + .toInstance(commonScheduledPool); bind(HttpClient.class).in(Singleton.class); diff --git a/core/src/main/java/org/geysermc/floodgate/news/NewsChecker.java b/core/src/main/java/org/geysermc/floodgate/news/NewsChecker.java index bff279d0..40358247 100644 --- a/core/src/main/java/org/geysermc/floodgate/news/NewsChecker.java +++ b/core/src/main/java/org/geysermc/floodgate/news/NewsChecker.java @@ -34,14 +34,10 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import org.geysermc.event.Listener; -import org.geysermc.event.subscribe.Subscribe; import org.geysermc.floodgate.api.logger.FloodgateLogger; import org.geysermc.floodgate.command.util.Permission; -import org.geysermc.floodgate.event.lifecycle.ShutdownEvent; import org.geysermc.floodgate.news.data.AnnouncementData; import org.geysermc.floodgate.news.data.BuildSpecificData; import org.geysermc.floodgate.news.data.CheckAfterData; @@ -52,10 +48,11 @@ import org.geysermc.floodgate.util.HttpClient; import org.geysermc.floodgate.util.HttpClient.HttpResponse; @AutoBind -@Listener public class NewsChecker { - private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); private final Map activeNewsItems = new HashMap<>(); + @Inject + @Named("commonScheduledPool") + private ScheduledExecutorService executorService; @Inject private CommandUtil commandUtil; @@ -199,15 +196,6 @@ public class NewsChecker { activateNews(item); } - public void shutdown() { - executorService.shutdown(); - } - - @Subscribe - public void onShutdown(ShutdownEvent ignored) { - shutdown(); - } - private void activateNews(NewsItem item) { for (NewsItemAction action : item.getActions()) { handleNewsItem(null, item, action); diff --git a/core/src/main/java/org/geysermc/floodgate/util/PostEnableMessages.java b/core/src/main/java/org/geysermc/floodgate/util/PostEnableMessages.java index 70bcdc30..e526c470 100644 --- a/core/src/main/java/org/geysermc/floodgate/util/PostEnableMessages.java +++ b/core/src/main/java/org/geysermc/floodgate/util/PostEnableMessages.java @@ -26,8 +26,11 @@ package org.geysermc.floodgate.util; import com.google.inject.Inject; +import com.google.inject.name.Named; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; import org.geysermc.event.Listener; import org.geysermc.event.subscribe.Subscribe; import org.geysermc.floodgate.api.logger.FloodgateLogger; @@ -41,6 +44,9 @@ public final class PostEnableMessages { @Inject private FloodgateConfig config; @Inject private FloodgateLogger logger; + @Inject + @Named("commonScheduledPool") + private ScheduledExecutorService executorService; public void add(String[] message, Object... args) { StringBuilder builder = new StringBuilder(); @@ -93,14 +99,11 @@ public final class PostEnableMessages { @Subscribe public void onPostEnable(PostEnableEvent ignored) { - new Thread(() -> { - // normally proxies don't have a lot of plugins, so proxies don't need to sleep as long - try { - Thread.sleep(config.isProxy() ? 2000 : 5000); - } catch (InterruptedException ignored1) { - } - - messages.forEach(logger::warn); - }).start(); + // normally proxies don't have a lot of plugins, so proxies don't need to sleep as long + executorService.schedule( + () -> messages.forEach(logger::warn), + config.isProxy() ? 2 : 5, + TimeUnit.SECONDS + ); } }