5 Commits

Author SHA1 Message Date
5c913fa2db feat: 添加 singleton-server-id 配置 2024-04-24 14:12:06 +08:00
08a41c1209 refactor: 在初始化中订阅redis连接 2024-04-24 11:44:36 +08:00
d38bd5e41f build: 更新版本号到 1.6.4 2024-03-27 10:37:33 +08:00
52e25a0433 Merge branch 'dev' 2024-03-27 10:36:18 +08:00
cc33304ad4 fix(ball-common): 修复 jedis 线程占用问题 2024-03-27 09:41:56 +08:00
7 changed files with 45 additions and 25 deletions

View File

@@ -49,9 +49,9 @@ repositories {
dependencies {
// 对于 Bukkit 插件
compileOnly("cn.hamster3.mc.plugin:ball-bukkit:1.6.3")
compileOnly("cn.hamster3.mc.plugin:ball-bukkit:1.6.4")
// 对于 BungeeCord 插件
compileOnly("cn.hamster3.mc.plugin:ball-bungee:1.6.3")
compileOnly("cn.hamster3.mc.plugin:ball-bungee:1.6.4")
}
```
@@ -77,13 +77,13 @@ dependencies {
<dependency>
<groupId>cn.hamster3.mc.plugin</groupId>
<artifactId>ball-bukkit</artifactId>
<version>1.6.3</version>
<version>1.6.4</version>
</dependency>
<!--对于 BungeeCord 插件-->
<dependency>
<groupId>cn.hamster3.mc.plugin</groupId>
<artifactId>ball-bungee</artifactId>
<version>1.6.3</version>
<version>1.6.4</version>
</dependency>
</dependencies>
</project>

View File

@@ -1,6 +1,13 @@
# 是否允许在控制台输出调试信息
debug: false
# 是否启用服务器 ID 单例模式
# 启用后,当一个服务器启动后将会占用 服务器唯一识别码
# 其他使用相同 服务器唯一识别码 的服务器将无法启动
# 测试端中可关闭该功能
# 推荐在正式服中开启该功能以防止服务器 ID 重复
singleton-server-id: false
# 频道名前缀
# 使用这个配置选项可以划分子服消息通信分组
# 只有在同一个频道名的子服才能互相通信

View File

@@ -1,6 +1,10 @@
# 是否允许在控制台输出调试信息
debug: false
# 是否启用服务器 ID 单例模式
# 启用后,服务器唯一识别码 相同的服务器将无法启动
singleton-server-id: false
# 频道名前缀
# 使用这个配置选项可以划分子服消息通信分组
# 只有在同一个频道名的子服才能互相通信

View File

@@ -102,12 +102,13 @@ public abstract class BallAPI {
getLogger().warning("已启用调试模式");
eventBus.register(BallDebugListener.INSTANCE);
}
CoreAPI.getInstance().getExecutorService().submit(() -> redisSub.subscribe(BallRedisListener.INSTANCE, BALL_CHANNEL));
}
protected void enable() throws SQLException, InterruptedException {
try (Jedis jedis = CoreAPI.getInstance().getJedisPool().getResource()) {
String key = "HamsterBall:ServerInfo:" + localServerInfo.getId();
if (jedis.exists(key)) {
if (jedis.exists(key) && ballConfig.isSingletonServerID()) {
throw new IllegalStateException("已经有一个服务器占用了该 ID");
}
jedis.hset(key, "id", localServerInfo.getId());
@@ -179,7 +180,6 @@ public abstract class BallAPI {
}
getLogger().info("从数据库中加载了 " + allServerInfo.size() + " 条服务器信息");
getLogger().info("从数据库中加载了 " + allPlayerInfo.size() + " 条玩家信息");
subscribeRaw(BALL_CHANNEL);
}
protected void disable() throws SQLException, InterruptedException {
@@ -521,13 +521,14 @@ public abstract class BallAPI {
* @param channels 频道名称
*/
public void subscribeRaw(@NotNull String... channels) {
CoreAPI.getInstance().getExecutorService().submit(() -> {
try {
redisSub.subscribe(BallRedisListener.INSTANCE, channels);
} catch (Exception | Error e) {
e.printStackTrace();
}
});
BallRedisListener.INSTANCE.subscribe(channels);
// CoreAPI.getInstance().getExecutorService().submit(() -> {
// try {
// redisSub.subscribe(BallRedisListener.INSTANCE, channels);
// } catch (Exception | Error e) {
// e.printStackTrace();
// }
// });
}
/**
@@ -536,9 +537,10 @@ public abstract class BallAPI {
* @param patterns 频道名称正则表达式
*/
public void subscribePatterns(@NotNull String patterns) {
CoreAPI.getInstance().getExecutorService().submit(
() -> redisSub.psubscribe(BallRedisListener.INSTANCE, patterns)
);
BallRedisListener.INSTANCE.psubscribe(patterns);
// CoreAPI.getInstance().getExecutorService().submit(
// () -> redisSub.psubscribe(BallRedisListener.INSTANCE, patterns)
// );
}
/**
@@ -546,22 +548,22 @@ public abstract class BallAPI {
* <p>
* 会自动加上 config 中设置的频道前缀
*
* @param channel 频道名称
* @param channels 频道名称
*/
public void unsubscribe(@NotNull String... channel) {
for (int i = 0; i < channel.length; i++) {
channel[i] = ballConfig.getChannelPrefix() + channel[i];
public void unsubscribe(@NotNull String... channels) {
for (int i = 0; i < channels.length; i++) {
channels[i] = ballConfig.getChannelPrefix() + channels[i];
}
BallRedisListener.INSTANCE.unsubscribe(channel);
unsubscribeRaw(channels);
}
/**
* 忽略频道前缀配置,取消订阅 redis 消息频道
*
* @param channel 频道名称
* @param channels 频道名称
*/
public void unsubscribeIgnorePrefix(@NotNull String... channel) {
BallRedisListener.INSTANCE.unsubscribe(channel);
public void unsubscribeRaw(@NotNull String... channels) {
BallRedisListener.INSTANCE.unsubscribe(channels);
}
/**

View File

@@ -11,13 +11,16 @@ import java.util.List;
@AllArgsConstructor
public class BallConfig {
private boolean debug;
private boolean singletonServerID;
@NotNull
private String channelPrefix;
private boolean gameServerUpdatePlayerInfo;
@NotNull
private List<String> loadPlayerInfoFilter;
public BallConfig(@NotNull ConfigSection config) {
debug = config.getBoolean("debug", false);
singletonServerID = config.getBoolean("singleton-server-id", false);
channelPrefix = config.getString("channel-prefix", "");
channelPrefix = channelPrefix.isEmpty() ? channelPrefix : channelPrefix + ":";
gameServerUpdatePlayerInfo = config.getBoolean("game-server-update-player-info", false);

View File

@@ -1,6 +1,10 @@
# 是否允许在控制台输出调试信息
debug: false
# 是否启用服务器 ID 单例模式
# 启用后,服务器唯一识别码 相同的服务器将无法启动
singleton-server-id: false
# 频道名前缀
# 使用这个配置选项可以划分子服消息通信分组
# 只有在同一个频道名的子服才能互相通信

View File

@@ -5,7 +5,7 @@ plugins {
}
group = "cn.hamster3.mc.plugin"
version = "1.6.3"
version = "1.6.5-SNAPSHOT"
description = "基于 Redis 的 Minecraft 服务端通用消息中间件"
subprojects {