mirror of
https://github.com/GeyserMC/Floodgate.git
synced 2025-12-19 14:59:20 +00:00
Use a common ScheduledThreadPool and make the player map concurrent
This commit is contained in:
@@ -32,10 +32,10 @@ import com.google.gson.JsonElement;
|
|||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import org.geysermc.cumulus.form.Form;
|
import org.geysermc.cumulus.form.Form;
|
||||||
import org.geysermc.cumulus.form.util.FormBuilder;
|
import org.geysermc.cumulus.form.util.FormBuilder;
|
||||||
@@ -51,7 +51,7 @@ import org.geysermc.floodgate.util.HttpClient;
|
|||||||
import org.geysermc.floodgate.util.Utils;
|
import org.geysermc.floodgate.util.Utils;
|
||||||
|
|
||||||
public class SimpleFloodgateApi implements FloodgateApi {
|
public class SimpleFloodgateApi implements FloodgateApi {
|
||||||
private final Map<UUID, FloodgatePlayer> players = new HashMap<>();
|
private final Map<UUID, FloodgatePlayer> players = new ConcurrentHashMap<>();
|
||||||
private final Cache<UUID, FloodgatePlayer> pendingRemove =
|
private final Cache<UUID, FloodgatePlayer> pendingRemove =
|
||||||
CacheBuilder.newBuilder()
|
CacheBuilder.newBuilder()
|
||||||
.expireAfterWrite(20, TimeUnit.SECONDS)
|
.expireAfterWrite(20, TimeUnit.SECONDS)
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ import io.netty.util.AttributeKey;
|
|||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.geysermc.event.PostOrder;
|
import org.geysermc.event.PostOrder;
|
||||||
import org.geysermc.floodgate.addon.data.HandshakeHandlersImpl;
|
import org.geysermc.floodgate.addon.data.HandshakeHandlersImpl;
|
||||||
@@ -87,8 +88,19 @@ public class CommonModule extends AbstractModule {
|
|||||||
});
|
});
|
||||||
|
|
||||||
ExecutorService commonPool = Executors.newCachedThreadPool();
|
ExecutorService commonPool = Executors.newCachedThreadPool();
|
||||||
eventBus.subscribe(ShutdownEvent.class, ignored -> commonPool.shutdown(), PostOrder.LAST);
|
ScheduledExecutorService commonScheduledPool = Executors.newSingleThreadScheduledExecutor();
|
||||||
bind(ExecutorService.class).annotatedWith(Names.named("commonPool")).toInstance(commonPool);
|
|
||||||
|
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);
|
bind(HttpClient.class).in(Singleton.class);
|
||||||
|
|
||||||
|
|||||||
@@ -34,14 +34,10 @@ import java.util.Collection;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
import java.util.concurrent.TimeUnit;
|
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.api.logger.FloodgateLogger;
|
||||||
import org.geysermc.floodgate.command.util.Permission;
|
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.AnnouncementData;
|
||||||
import org.geysermc.floodgate.news.data.BuildSpecificData;
|
import org.geysermc.floodgate.news.data.BuildSpecificData;
|
||||||
import org.geysermc.floodgate.news.data.CheckAfterData;
|
import org.geysermc.floodgate.news.data.CheckAfterData;
|
||||||
@@ -52,10 +48,11 @@ import org.geysermc.floodgate.util.HttpClient;
|
|||||||
import org.geysermc.floodgate.util.HttpClient.HttpResponse;
|
import org.geysermc.floodgate.util.HttpClient.HttpResponse;
|
||||||
|
|
||||||
@AutoBind
|
@AutoBind
|
||||||
@Listener
|
|
||||||
public class NewsChecker {
|
public class NewsChecker {
|
||||||
private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
|
|
||||||
private final Map<Integer, NewsItem> activeNewsItems = new HashMap<>();
|
private final Map<Integer, NewsItem> activeNewsItems = new HashMap<>();
|
||||||
|
@Inject
|
||||||
|
@Named("commonScheduledPool")
|
||||||
|
private ScheduledExecutorService executorService;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private CommandUtil commandUtil;
|
private CommandUtil commandUtil;
|
||||||
@@ -199,15 +196,6 @@ public class NewsChecker {
|
|||||||
activateNews(item);
|
activateNews(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void shutdown() {
|
|
||||||
executorService.shutdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Subscribe
|
|
||||||
public void onShutdown(ShutdownEvent ignored) {
|
|
||||||
shutdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void activateNews(NewsItem item) {
|
private void activateNews(NewsItem item) {
|
||||||
for (NewsItemAction action : item.getActions()) {
|
for (NewsItemAction action : item.getActions()) {
|
||||||
handleNewsItem(null, item, action);
|
handleNewsItem(null, item, action);
|
||||||
|
|||||||
@@ -26,8 +26,11 @@
|
|||||||
package org.geysermc.floodgate.util;
|
package org.geysermc.floodgate.util;
|
||||||
|
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
|
import com.google.inject.name.Named;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
import org.geysermc.event.Listener;
|
import org.geysermc.event.Listener;
|
||||||
import org.geysermc.event.subscribe.Subscribe;
|
import org.geysermc.event.subscribe.Subscribe;
|
||||||
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
||||||
@@ -41,6 +44,9 @@ public final class PostEnableMessages {
|
|||||||
|
|
||||||
@Inject private FloodgateConfig config;
|
@Inject private FloodgateConfig config;
|
||||||
@Inject private FloodgateLogger logger;
|
@Inject private FloodgateLogger logger;
|
||||||
|
@Inject
|
||||||
|
@Named("commonScheduledPool")
|
||||||
|
private ScheduledExecutorService executorService;
|
||||||
|
|
||||||
public void add(String[] message, Object... args) {
|
public void add(String[] message, Object... args) {
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
@@ -93,14 +99,11 @@ public final class PostEnableMessages {
|
|||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void onPostEnable(PostEnableEvent ignored) {
|
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
|
||||||
// normally proxies don't have a lot of plugins, so proxies don't need to sleep as long
|
executorService.schedule(
|
||||||
try {
|
() -> messages.forEach(logger::warn),
|
||||||
Thread.sleep(config.isProxy() ? 2000 : 5000);
|
config.isProxy() ? 2 : 5,
|
||||||
} catch (InterruptedException ignored1) {
|
TimeUnit.SECONDS
|
||||||
}
|
);
|
||||||
|
|
||||||
messages.forEach(logger::warn);
|
|
||||||
}).start();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user