From 4ebcda9e8090af29e3e593d074a323385261c8f1 Mon Sep 17 00:00:00 2001 From: Enaium Date: Tue, 24 Dec 2024 21:07:19 +0800 Subject: [PATCH 1/2] Support reconnect --- README.md | 2 +- build.gradle.kts | 2 +- gradle.properties | 5 ++-- gradle/wrapper/gradle-wrapper.properties | 2 +- .../cn/enaium/kookstarter/KookStarter.java | 15 ++++++++--- .../client/socket/DefaultClient.java | 25 ++++++++++++++----- .../client/socket/DefaultHandler.java | 15 ++++++++--- 7 files changed, 48 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 25410a1..4127a27 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # kook-spring-boot-stater ![OpenJDK](https://img.shields.io/badge/OpenJDK-21-white?style=flat-square&logo=OpenJDK) -![SpringBoot](https://img.shields.io/badge/SpringBoot-3.2-green?style=flat-square&logo=SpringBoot) +![SpringBoot](https://img.shields.io/badge/SpringBoot-3.4-green?style=flat-square&logo=SpringBoot) ![Maven-Central](https://img.shields.io/maven-central/v/cn.enaium/kook-spring-boot-starter?style=flat-square) ![JitPack](https://img.shields.io/jitpack/version/com.github.Enaium/kook-spring-boot-starter?style=flat-square) ![GitHub](https://img.shields.io/github/license/enaium/kook-spring-boot-starter?style=flat-square) diff --git a/build.gradle.kts b/build.gradle.kts index 15ceebe..fcf941b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,7 +15,7 @@ java { } group = "cn.enaium" -version = "0.4.2" +version = property("version").toString() repositories { mavenCentral() diff --git a/gradle.properties b/gradle.properties index a1f5e07..4aea2f3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,3 @@ -springboot=3.2.4 -annotations=24.1.0 \ No newline at end of file +springboot=3.4.1 +annotations=24.1.0 +version=0.5.0 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c05cce1..b52fd68 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Sun Mar 31 09:49:36 CST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/main/java/cn/enaium/kookstarter/KookStarter.java b/src/main/java/cn/enaium/kookstarter/KookStarter.java index 914ebaf..8dfbf45 100644 --- a/src/main/java/cn/enaium/kookstarter/KookStarter.java +++ b/src/main/java/cn/enaium/kookstarter/KookStarter.java @@ -42,9 +42,16 @@ public KookStarter(DefaultClient defaultClient) { @Bean public CommandLineRunner run() { - - LOGGER.info("KookStarter is starting..."); - - return args -> defaultClient.connect(); + return args -> { + Thread thread = new Thread(() -> { + try { + LOGGER.info("KookStarter启动中..."); + defaultClient.connect().block(); + } catch (Exception e) { + LOGGER.error("KookStarter启动失败: {}", e.getMessage()); + } + }); + thread.start(); + }; } } diff --git a/src/main/java/cn/enaium/kookstarter/client/socket/DefaultClient.java b/src/main/java/cn/enaium/kookstarter/client/socket/DefaultClient.java index 75e367f..ac49d3b 100644 --- a/src/main/java/cn/enaium/kookstarter/client/socket/DefaultClient.java +++ b/src/main/java/cn/enaium/kookstarter/client/socket/DefaultClient.java @@ -17,10 +17,13 @@ package cn.enaium.kookstarter.client.socket; import cn.enaium.kookstarter.client.http.GatewayService; -import cn.enaium.kookstarter.model.response.GatewayIndexResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.springframework.web.reactive.socket.client.ReactorNettyWebSocketClient; +import reactor.core.publisher.Mono; +import reactor.core.scheduler.Schedulers; import java.net.URI; @@ -29,6 +32,9 @@ */ @Component public class DefaultClient { + + private static final Logger LOGGER = LoggerFactory.getLogger(DefaultClient.class); + private final GatewayService gatewayService; private final DefaultHandler defaultHandler; @@ -37,10 +43,17 @@ public DefaultClient(GatewayService gatewayService, @Lazy DefaultHandler default this.defaultHandler = defaultHandler; } - public void connect() { - final GatewayIndexResponse gatewayIndexResponse = gatewayService.gatewayIndex(0); - if (gatewayIndexResponse.code() == 0) { - new ReactorNettyWebSocketClient().execute(URI.create(gatewayIndexResponse.data().url()), defaultHandler).subscribe(); - } + public Mono connect() { + return Mono.fromCallable(() -> gatewayService.gatewayIndex(0)) + .subscribeOn(Schedulers.boundedElastic()) + .flatMap(gatewayIndexResponse -> { + if (gatewayIndexResponse.code() == 0) { + LOGGER.info("获取网关地址成功: {}", gatewayIndexResponse.data().url()); + return new ReactorNettyWebSocketClient().execute(URI.create(gatewayIndexResponse.data().url()), defaultHandler); + } else { + LOGGER.error("获取网关地址失败: {}", gatewayIndexResponse.message()); + return connect(); + } + }); } } diff --git a/src/main/java/cn/enaium/kookstarter/client/socket/DefaultHandler.java b/src/main/java/cn/enaium/kookstarter/client/socket/DefaultHandler.java index eda19a7..7991a18 100644 --- a/src/main/java/cn/enaium/kookstarter/client/socket/DefaultHandler.java +++ b/src/main/java/cn/enaium/kookstarter/client/socket/DefaultHandler.java @@ -55,6 +55,8 @@ public class DefaultHandler implements WebSocketHandler { public AtomicInteger sn = new AtomicInteger(); + private long lastPong = System.currentTimeMillis(); + public DefaultHandler(ObjectMapper objectMapper, ApplicationEventPublisher publisher, DefaultClient defaultClient, ApplicationContext applicationContext) { this.objectMapper = objectMapper; this.publisher = publisher; @@ -84,13 +86,20 @@ public DefaultHandler(ObjectMapper objectMapper, ApplicationEventPublisher publi switch (jsonNode.get("s").intValue()) { case 1 -> //握手成功 LOGGER.info("连接建立成功"); - case 3 -> {//收到pong - + case 3 -> {//收到pong,延迟1分钟检查服务器是否响应 + lastPong = System.currentTimeMillis(); + Mono.delay(Duration.ofMinutes(1)).subscribe(delay -> { + if (System.currentTimeMillis() - lastPong > 30000) { + LOGGER.error("服务器未响应"); + defaultClient.connect().doOnSuccess(it -> LOGGER.info("服务器未响应,重新连接")).subscribe(); + } + }); } case 5 -> {//要求客户端断开当前连接重新连接 LOGGER.info("服务器要求客户端断开当前连接重新连接"); sn.set(0); - session.close().doOnSuccess(unused -> defaultClient.connect()).subscribe(); + session.close().block(); + defaultClient.connect().subscribe(); } case 0 -> {//事件 final var data = jsonNode.get("d"); From 5059076828ac1064a7cd91665eb3b28cd88a7c65 Mon Sep 17 00:00:00 2001 From: Enaium Date: Tue, 24 Dec 2024 21:09:03 +0800 Subject: [PATCH 2/2] Update gradle.yml --- .github/workflows/gradle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index d4e3ee5..98342e9 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -32,4 +32,4 @@ jobs: uses: gradle/gradle-build-action@v2 with: arguments: build - gradle-version: 8.7 \ No newline at end of file + gradle-version: 8.12 \ No newline at end of file