diff --git a/build.gradle.kts b/build.gradle.kts index ad0ba24..bfead72 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,5 +1,3 @@ -//file:noinspection GrDeprecatedAPIUsage - plugins { id("java") id("maven-publish") @@ -36,7 +34,7 @@ subprojects { java { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 - withJavadocJar() +// withJavadocJar() withSourcesJar() } @@ -98,5 +96,4 @@ subprojects { } } } - } \ No newline at end of file diff --git a/core-bukkit/build.gradle.kts b/core-bukkit/build.gradle.kts index f695c7e..319e7ed 100644 --- a/core-bukkit/build.gradle.kts +++ b/core-bukkit/build.gradle.kts @@ -34,8 +34,14 @@ dependencies { exclude(group = "org.jetbrains") } - //noinspection GradlePackageUpdate - implementation("com.zaxxer:HikariCP:${property("HikariCP_version")}") { + val hikariVersion = property("HikariCP_version") + implementation("com.zaxxer:HikariCP:${hikariVersion}") { + exclude(group = "org.slf4j") + } + val redissionVersion = property("redission_version") + implementation("org.redisson:redisson:${redissionVersion}") { + exclude(group = "io.netty") + exclude(group = "org.yaml") exclude(group = "org.slf4j") } } diff --git a/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/api/CoreBukkitAPI.java b/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/api/CoreBukkitAPI.java index 005027a..673d951 100644 --- a/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/api/CoreBukkitAPI.java +++ b/core-bukkit/src/main/java/cn/hamster3/mc/plugin/core/bukkit/api/CoreBukkitAPI.java @@ -8,13 +8,24 @@ import net.kyori.adventure.platform.bukkit.BukkitAudiences; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; import org.jetbrains.annotations.NotNull; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; +import java.util.Objects; @SuppressWarnings("unused") public final class CoreBukkitAPI extends CoreAPI { private final HikariDataSource datasource; + private final RedissonClient redissonClient; private CoreBukkitAPI() { - FileConfiguration config = HamsterCorePlugin.getInstance().getConfig(); + HamsterCorePlugin plugin = HamsterCorePlugin.getInstance(); + FileConfiguration config = plugin.getConfig(); ConfigurationSection datasourceConfig = config.getConfigurationSection("datasource"); if (datasourceConfig == null) { @@ -36,8 +47,20 @@ public final class CoreBukkitAPI extends CoreAPI { hikariConfig.setMaxLifetime(datasourceConfig.getLong("max-lifetime", 30 * 60 * 1000)); hikariConfig.setValidationTimeout(datasourceConfig.getLong("validation-timeout", 5000)); hikariConfig.setPoolName("HamsterCore-Pool"); - datasource = new HikariDataSource(hikariConfig); + + File file = new File(plugin.getDataFolder(), "redission.yml"); + try { + if (!file.exists()) { + Files.copy( + Objects.requireNonNull(plugin.getResource("redission.yml")), + file.toPath(), StandardCopyOption.REPLACE_EXISTING + ); + } + redissonClient = Redisson.create(Config.fromYAML(file)); + } catch (IOException e) { + throw new RuntimeException("redis 连接加载失败!", e); + } } public static CoreBukkitAPI getInstance() { @@ -61,9 +84,8 @@ public final class CoreBukkitAPI extends CoreAPI { return datasource; } - public void reportError(@NotNull String projectID, @NotNull Throwable exception) { - } - - public void reportFile(@NotNull String projectID, @NotNull String filename, byte @NotNull [] bytes) { + @Override + public @NotNull RedissonClient getRedissonClient() { + return redissonClient; } } diff --git a/core-bungeecord/build.gradle.kts b/core-bungeecord/build.gradle.kts index 4b1cb76..b495218 100644 --- a/core-bungeecord/build.gradle.kts +++ b/core-bungeecord/build.gradle.kts @@ -27,8 +27,14 @@ dependencies { exclude(group = "org.jetbrains") } - //noinspection GradlePackageUpdate - implementation("com.zaxxer:HikariCP:${property("HikariCP_version")}") { + val hikariVersion = property("HikariCP_version") + implementation("com.zaxxer:HikariCP:${hikariVersion}") { + exclude(group = "org.slf4j") + } + val redissionVersion = property("redission_version") + implementation("org.redisson:redisson:${redissionVersion}") { + exclude(group = "io.netty") + exclude(group = "org.yaml") exclude(group = "org.slf4j") } } diff --git a/core-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/CoreBungeeAPI.java b/core-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/CoreBungeeAPI.java index 69ddd2d..79caa40 100644 --- a/core-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/CoreBungeeAPI.java +++ b/core-bungeecord/src/main/java/cn/hamster3/mc/plugin/core/bungee/api/CoreBungeeAPI.java @@ -8,10 +8,19 @@ import com.zaxxer.hikari.HikariDataSource; import net.kyori.adventure.platform.AudienceProvider; import net.md_5.bungee.config.Configuration; import org.jetbrains.annotations.NotNull; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; @SuppressWarnings("unused") public final class CoreBungeeAPI extends CoreAPI { private final HikariDataSource datasource; + private final RedissonClient redissonClient; private CoreBungeeAPI() { HamsterCorePlugin plugin = HamsterCorePlugin.getInstance(); @@ -37,8 +46,21 @@ public final class CoreBungeeAPI extends CoreAPI { hikariConfig.setMaxLifetime(datasourceConfig.getLong("max-lifetime", 30 * 60 * 1000)); hikariConfig.setValidationTimeout(datasourceConfig.getLong("validation-timeout", 5000)); hikariConfig.setPoolName("HamsterCore-Pool"); - datasource = new HikariDataSource(hikariConfig); + + + File file = new File(plugin.getDataFolder(), "redission.yml"); + try { + if (!file.exists()) { + Files.copy( + plugin.getResourceAsStream("redission.yml"), + file.toPath(), StandardCopyOption.REPLACE_EXISTING + ); + } + redissonClient = Redisson.create(Config.fromYAML(file)); + } catch (IOException e) { + throw new RuntimeException("redis 连接加载失败!", e); + } } public static CoreBungeeAPI getInstance() { @@ -61,4 +83,9 @@ public final class CoreBungeeAPI extends CoreAPI { public @NotNull HikariDataSource getDataSource() { return datasource; } + + @Override + public @NotNull RedissonClient getRedissonClient() { + return redissonClient; + } } diff --git a/core-common/build.gradle.kts b/core-common/build.gradle.kts index 7cc655a..e6be1c1 100644 --- a/core-common/build.gradle.kts +++ b/core-common/build.gradle.kts @@ -5,6 +5,7 @@ dependencies { //noinspection GradlePackageUpdate //noinspection VulnerableLibrariesLocal compileOnly("com.google.code.gson:gson:2.8.0") + val adventureVersion = property("adventure_version") // https://mvnrepository.com/artifact/net.kyori/adventure-platform-api implementation("net.kyori:adventure-platform-api:${adventureVersion}") { @@ -24,6 +25,13 @@ dependencies { implementation("net.kyori:adventure-text-serializer-legacy:${adventureSerializerVersion}") { exclude(group = "org.jetbrains") } + + val redissionVersion = property("redission_version") + implementation("org.redisson:redisson:${redissionVersion}") { + exclude(group = "io.netty") + exclude(group = "org.yaml") + exclude(group = "org.slf4j") + } } tasks { diff --git a/core-common/src/main/java/cn/hamster3/mc/plugin/core/common/api/CoreAPI.java b/core-common/src/main/java/cn/hamster3/mc/plugin/core/common/api/CoreAPI.java index fa0c541..799b139 100644 --- a/core-common/src/main/java/cn/hamster3/mc/plugin/core/common/api/CoreAPI.java +++ b/core-common/src/main/java/cn/hamster3/mc/plugin/core/common/api/CoreAPI.java @@ -2,6 +2,7 @@ package cn.hamster3.mc.plugin.core.common.api; import net.kyori.adventure.platform.AudienceProvider; import org.jetbrains.annotations.NotNull; +import org.redisson.api.RedissonClient; import javax.sql.DataSource; import java.sql.Connection; @@ -25,4 +26,7 @@ public abstract class CoreAPI { public Connection getConnection() throws SQLException { return getDataSource().getConnection(); } + + @NotNull + public abstract RedissonClient getRedissonClient(); } diff --git a/core-common/src/main/resources/datasource.yml b/core-common/src/main/resources/datasource.yml new file mode 100644 index 0000000..d0cf0f5 --- /dev/null +++ b/core-common/src/main/resources/datasource.yml @@ -0,0 +1,41 @@ +# 数据库链接驱动地址 +# 除非你知道自己在做什么,否则不建议更改该项 +# 旧版服务端(低于1.13)请使用:com.mysql.jdbc.Driver +driver: "com.mysql.cj.jdbc.Driver" +# 数据库链接填写格式: +# jdbc:mysql://{数据库地址}:{数据库端口}/{使用的库名}?参数 +# 除非你知道自己在做什么,否则不建议随意更改参数 +url: "jdbc:mysql://sql.hamster3.cn:3306/Test1?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true" +# 用户名 +username: "Test" +# 密码 +password: "Test123.." +# 最小闲置链接数 +# 推荐值:0~3 +minimum-idle: 0 +# 最大链接数 +# 推荐值: +# 子服:最大在线玩家数/10,且不低于3 +# BC:最大在线玩家数/20,且不低于5 +maximum-pool-size: 3 +# 保持连接池可用的间隔 +# 除非你的服务器数据库连接经常断开,否则不建议启用该选项 +# 单位:毫秒 +# 默认值为0(禁用) +keep-alive-time: 0 +# 连接闲置回收时间 +# 单位:毫秒 +# 推荐值:600000(10分钟) +idle-timeout: 600000 +# 链接最长存活时间 +# 单位:毫秒 +max-lifetime: 1800000 +# 验证连接存活的超时时间 +# 单位:毫秒 +validation-timeout: 5000 + + + +# 如果你不需要做多端跨服,那么请使用 sqlite 作本地数据库 +# driver: "org.sqlite.JDBC" +# url: "jdbc:sqlite:./plugins/HamsterCore/database.db" diff --git a/core-common/src/main/resources/redission.yml b/core-common/src/main/resources/redission.yml new file mode 100644 index 0000000..85afea5 --- /dev/null +++ b/core-common/src/main/resources/redission.yml @@ -0,0 +1,36 @@ +singleServerConfig: + address: "redis://localhost:6379" + password: "Reids123.." + username: "default" + database: 1 + clientName: "" + idleConnectionTimeout: 10000 + connectTimeout: 10000 + timeout: 3000 + retryAttempts: 3 + retryInterval: 1500 + subscriptionsPerConnection: 5 + sslEnableEndpointIdentification: true + sslProvider: "JDK" + pingConnectionInterval: 30000 + keepAlive: false + tcpNoDelay: true + subscriptionConnectionMinimumIdleSize: 1 + subscriptionConnectionPoolSize: 50 + connectionMinimumIdleSize: 1 + connectionPoolSize: 10 + dnsMonitoringInterval: 5000 +threads: 4 +nettyThreads: 8 +referenceEnabled: true +lockWatchdogTimeout: 30000 +checkLockSyncedSlaves: true +slavesSyncTimeout: 1000 +reliableTopicWatchdogTimeout: 600000 +keepPubSubOrder: true +useScriptCache: false +minCleanUpDelay: 5 +maxCleanUpDelay: 1800 +cleanUpKeysAmount: 100 +useThreadClassLoader: true +lazyInitialization: false diff --git a/gradle.properties b/gradle.properties index 20f7cd1..0b8694a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,5 @@ org.gradle.jvmargs=-Xmx2G adventure_version=4.3.0 adventure_serializer_version=4.14.0 -HikariCP_version=4.0.3 \ No newline at end of file +HikariCP_version=4.0.3 +redission_version=3.23.2