Commit 3e80defb authored by p x's avatar p x
Browse files

调通netty websocket

parent e40793c6
...@@ -27,7 +27,7 @@ repositories { ...@@ -27,7 +27,7 @@ repositories {
dependencies { dependencies {
implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-websocket") // implementation("org.springframework.boot:spring-boot-starter-websocket")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.jetbrains.kotlin:kotlin-reflect")
compileOnly("org.projectlombok:lombok") compileOnly("org.projectlombok:lombok")
...@@ -40,6 +40,7 @@ dependencies { ...@@ -40,6 +40,7 @@ dependencies {
implementation("com.alibaba.fastjson2:fastjson2:2.0.60") implementation("com.alibaba.fastjson2:fastjson2:2.0.60")
// https://mvnrepository.com/artifact/io.netty/netty-all // https://mvnrepository.com/artifact/io.netty/netty-all
implementation("io.netty:netty-all:4.2.9.Final") implementation("io.netty:netty-all:4.2.9.Final")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1")
} }
kotlin { kotlin {
......
2026-01-07 14:09:15 [main] INFO com.inzy.wsmock.WsmockApplicationKt (StartupInfoLogger.java:532026-01-07 14:09:15 [main] INFO com.inzy.wsmock.WsmockApplicationKt (SpringApplication.java:6522026-01-07 14:09:15 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer (TomcatWebServer.java:1112026-01-07 14:09:15 [main] INFO o.a.catalina.core.StandardService (DirectJDKLog.java:1682026-01-07 14:09:15 [main] INFO o.a.catalina.core.StandardEngine (DirectJDKLog.java:1682026-01-07 14:09:15 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] (DirectJDKLog.java:1682026-01-07 14:09:15 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext (ServletWebServerApplicationContext.java:3012026-01-07 14:09:15 [main] INFO o.s.b.a.w.s.WelcomePageHandlerMapping (WelcomePageHandlerMapping.java:592026-01-07 14:09:15 [DefaultDispatcher-worker-1] INFO c.inzy.wsmock.NettyWebSocketServer (NettyWebSocketServer.kt:622026-01-07 14:09:16 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer (TomcatWebServer.java:2432026-01-07 14:09:16 [main] INFO com.inzy.wsmock.WsmockApplicationKt (StartupInfoLogger.java:592026-01-07 14:10:17 [SpringApplicationShutdownHook] INFO o.s.b.w.e.tomcat.GracefulShutdown (GracefulShutdown.java:542026-01-07 14:10:17 [tomcat-shutdown] INFO o.s.b.w.e.tomcat.GracefulShutdown (GracefulShutdown.java:762026-01-07 14:10:17 [DefaultDispatcher-worker-1] INFO c.inzy.wsmock.NettyWebSocketServer (NettyWebSocketServer.kt:722026-01-07 14:10:17 [SpringApplicationShutdownHook] INFO c.inzy.wsmock.NettyWebSocketServer (NettyWebSocketServer.kt:862026-01-07 14:11:01 [main] INFO com.inzy.wsmock.WsmockApplicationKt (StartupInfoLogger.java:532026-01-07 14:11:01 [main] INFO com.inzy.wsmock.WsmockApplicationKt (SpringApplication.java:6522026-01-07 14:11:02 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer (TomcatWebServer.java:1112026-01-07 14:11:02 [main] INFO o.a.catalina.core.StandardService (DirectJDKLog.java:1682026-01-07 14:11:02 [main] INFO o.a.catalina.core.StandardEngine (DirectJDKLog.java:1682026-01-07 14:11:02 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] (DirectJDKLog.java:1682026-01-07 14:11:02 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext (ServletWebServerApplicationContext.java:3012026-01-07 14:11:02 [main] INFO o.s.b.a.w.s.WelcomePageHandlerMapping (WelcomePageHandlerMapping.java:592026-01-07 14:11:02 [DefaultDispatcher-worker-1] INFO c.inzy.wsmock.NettyWebSocketServer (NettyWebSocketServer.kt:622026-01-07 14:11:02 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer (TomcatWebServer.java:2432026-01-07 14:11:02 [main] INFO com.inzy.wsmock.WsmockApplicationKt (StartupInfoLogger.java:592026-01-07 14:11:02 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:11:07 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:11:12 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:11:17 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:11:22 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:11:27 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:11:32 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:11:37 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:11:42 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:11:47 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:11:52 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:11:57 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:11:59 [SpringApplicationShutdownHook] INFO o.s.b.w.e.tomcat.GracefulShutdown (GracefulShutdown.java:542026-01-07 14:11:59 [tomcat-shutdown] INFO o.s.b.w.e.tomcat.GracefulShutdown (GracefulShutdown.java:762026-01-07 14:11:59 [DefaultDispatcher-worker-1] INFO c.inzy.wsmock.NettyWebSocketServer (NettyWebSocketServer.kt:722026-01-07 14:11:59 [SpringApplicationShutdownHook] INFO c.inzy.wsmock.NettyWebSocketServer (NettyWebSocketServer.kt:862026-01-07 14:12:02 [main] INFO com.inzy.wsmock.WsmockApplicationKt (StartupInfoLogger.java:532026-01-07 14:12:02 [main] INFO com.inzy.wsmock.WsmockApplicationKt (SpringApplication.java:6522026-01-07 14:12:02 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer (TomcatWebServer.java:1112026-01-07 14:12:02 [main] INFO o.a.catalina.core.StandardService (DirectJDKLog.java:1682026-01-07 14:12:02 [main] INFO o.a.catalina.core.StandardEngine (DirectJDKLog.java:1682026-01-07 14:12:02 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] (DirectJDKLog.java:1682026-01-07 14:12:02 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext (ServletWebServerApplicationContext.java:3012026-01-07 14:12:03 [main] INFO o.s.b.a.w.s.WelcomePageHandlerMapping (WelcomePageHandlerMapping.java:592026-01-07 14:12:03 [DefaultDispatcher-worker-1] INFO c.inzy.wsmock.NettyWebSocketServer (NettyWebSocketServer.kt:622026-01-07 14:12:03 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer (TomcatWebServer.java:2432026-01-07 14:12:03 [main] INFO com.inzy.wsmock.WsmockApplicationKt (StartupInfoLogger.java:592026-01-07 14:12:03 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:12:08 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:12:13 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:12:18 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:12:23 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:12:28 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:12:33 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:12:38 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:12:43 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:12:48 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:12:53 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:12:58 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:13:03 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:13:08 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:13:13 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:13:18 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:13:23 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:13:28 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:13:33 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:13:38 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:13:43 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:13:48 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:13:53 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:13:58 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:14:03 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:14:08 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:14:13 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:14:18 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:14:23 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:14:28 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask (ScheduledPushTask.kt:352026-01-07 14:14:33 [SpringApplicationShutdownHook] INFO o.s.b.w.e.tomcat.GracefulShutdown (GracefulShutdown.java:542026-01-07 14:14:33 [tomcat-shutdown] INFO o.s.b.w.e.tomcat.GracefulShutdown (GracefulShutdown.java:762026-01-07 14:14:33 [DefaultDispatcher-worker-1] INFO c.inzy.wsmock.NettyWebSocketServer (NettyWebSocketServer.kt:722026-01-07 14:14:33 [SpringApplicationShutdownHook] INFO c.inzy.wsmock.NettyWebSocketServer (NettyWebSocketServer.kt:862026-01-07 14:14:36 [main] INFO com.inzy.wsmock.WsmockApplicationKt.logStarting - Starting WsmockApplicationKt using Java 17.0.15 with PID 21816 (D:\JavaWorkSpace\wsmock\build\classes\kotlin\main started by Administrator in D:\JavaWorkSpace\wsmock)
2026-01-07 14:14:36 [main] INFO com.inzy.wsmock.WsmockApplicationKt.logStartupProfileInfo - No active profile set, falling back to 1 default profile: "default"
2026-01-07 14:14:36 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer.initialize - Tomcat initialized with port 8088 (http)
2026-01-07 14:14:36 [main] INFO o.a.catalina.core.StandardService.log - Starting service [Tomcat]
2026-01-07 14:14:36 [main] INFO o.a.catalina.core.StandardEngine.log - Starting Servlet engine: [Apache Tomcat/10.1.50]
2026-01-07 14:14:36 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/].log - Initializing Spring embedded WebApplicationContext
2026-01-07 14:14:36 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext.prepareWebApplicationContext - Root WebApplicationContext: initialization completed in 493 ms
2026-01-07 14:14:36 [main] INFO o.s.b.a.w.s.WelcomePageHandlerMapping.<init> - Adding welcome page: class path resource [static/index.html]
2026-01-07 14:14:36 [DefaultDispatcher-worker-1] INFO c.inzy.wsmock.NettyWebSocketServer.invokeSuspend - Netty WebSocket服务启动成功,端口:8089
2026-01-07 14:14:36 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer.start - Tomcat started on port 8088 (http) with context path '/'
2026-01-07 14:14:36 [main] INFO com.inzy.wsmock.WsmockApplicationKt.logStarted - Started WsmockApplicationKt in 1.159 seconds (process running for 1.529)
2026-01-07 14:14:37 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:14:36.957873900"}
2026-01-07 14:14:41 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:14:41.966311200"}
2026-01-07 14:14:46 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:14:46.968070200"}
2026-01-07 14:14:51 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:14:51.955797"}
2026-01-07 14:14:56 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:14:56.968913900"}
2026-01-07 14:15:01 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:15:01.963917400"}
2026-01-07 14:15:06 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:15:06.955998400"}
2026-01-07 14:15:11 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:15:11.953984900"}
2026-01-07 14:15:16 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:15:16.954429300"}
2026-01-07 14:15:21 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:15:21.968936800"}
2026-01-07 14:15:26 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:15:26.962768700"}
2026-01-07 14:15:31 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:15:31.965284800"}
2026-01-07 14:15:36 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:15:36.957533800"}
2026-01-07 14:15:41 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:15:41.956495200"}
2026-01-07 14:15:46 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:15:46.964433300"}
2026-01-07 14:15:51 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:15:51.960379"}
2026-01-07 14:15:56 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:15:56.966601400"}
2026-01-07 14:16:01 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:16:01.961676500"}
2026-01-07 14:16:06 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:16:06.958366100"}
2026-01-07 14:16:11 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:16:11.960047400"}
2026-01-07 14:16:16 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:16:16.957561"}
2026-01-07 14:16:21 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:16:21.956541"}
2026-01-07 14:16:26 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:16:26.958019500"}
2026-01-07 14:16:31 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:16:31.958035600"}
2026-01-07 14:16:36 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:16:36.957741200"}
2026-01-07 14:16:41 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:16:41.957532600"}
2026-01-07 14:16:46 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:16:46.956808100"}
2026-01-07 14:16:51 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:16:51.956528700"}
2026-01-07 14:16:56 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:16:56.954569300"}
2026-01-07 14:17:01 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:17:01.956312800"}
2026-01-07 14:17:06 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:17:06.964470300"}
2026-01-07 14:17:11 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:17:11.962387800"}
2026-01-07 14:17:16 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:17:16.955144700"}
2026-01-07 14:17:21 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:17:21.954918800"}
2026-01-07 14:17:26 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:17:26.961842100"}
2026-01-07 14:17:31 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:17:31.960143300"}
2026-01-07 14:17:36 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:17:36.959315"}
2026-01-07 14:17:41 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:17:41.960699700"}
2026-01-07 14:17:46 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:17:46.967434900"}
2026-01-07 14:17:51 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:17:51.959998800"}
2026-01-07 14:17:56 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:17:56.959641600"}
2026-01-07 14:18:01 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:18:01.968332"}
2026-01-07 14:18:06 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:18:06.955280500"}
2026-01-07 14:18:11 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:18:11.968982900"}
2026-01-07 14:18:16 [scheduling-1] INFO com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:18:16.956365600"}
2026-01-07 14:18:19 [SpringApplicationShutdownHook] INFO o.s.b.w.e.tomcat.GracefulShutdown.shutDownGracefully - Commencing graceful shutdown. Waiting for active requests to complete
2026-01-07 14:18:19 [tomcat-shutdown] INFO o.s.b.w.e.tomcat.GracefulShutdown.doShutdown - Graceful shutdown complete
2026-01-07 14:18:19 [SpringApplicationShutdownHook] INFO c.inzy.wsmock.NettyWebSocketServer.stop - Netty WebSocket服务已关闭
2026-01-07 14:18:19 [DefaultDispatcher-worker-1] INFO c.inzy.wsmock.NettyWebSocketServer.invokeSuspend - Netty线程组已关闭
2026-01-07 14:18:30 [main] INFO com.inzy.wsmock.WsmockApplicationKt.logStarting - Starting WsmockApplicationKt using Java 17.0.15 with PID 15868 (D:\JavaWorkSpace\wsmock\build\classes\kotlin\main started by Administrator in D:\JavaWorkSpace\wsmock)
2026-01-07 14:18:30 [main] DEBUG com.inzy.wsmock.WsmockApplicationKt.logStarting - Running with Spring Boot v3.5.9, Spring v6.2.15
2026-01-07 14:18:30 [main] INFO com.inzy.wsmock.WsmockApplicationKt.logStartupProfileInfo - No active profile set, falling back to 1 default profile: "default"
2026-01-07 14:18:31 [main] INFO o.a.catalina.core.StandardService.log - Starting service [Tomcat]
2026-01-07 14:18:31 [main] INFO o.a.catalina.core.StandardEngine.log - Starting Servlet engine: [Apache Tomcat/10.1.50]
2026-01-07 14:18:31 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/].log - Initializing Spring embedded WebApplicationContext
2026-01-07 14:18:31 [DefaultDispatcher-worker-1] INFO c.inzy.wsmock.NettyWebSocketServer.invokeSuspend - Netty WebSocket服务启动成功,端口:8089
2026-01-07 14:18:31 [main] INFO com.inzy.wsmock.WsmockApplicationKt.logStarted - Started WsmockApplicationKt in 1.159 seconds (process running for 1.435)
2026-01-07 14:18:31 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:18:31.428837200"}
2026-01-07 14:18:36 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:18:36.491382200"}
2026-01-07 14:18:41 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:18:41.505609400"}
2026-01-07 14:18:46 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:18:46.516209800"}
2026-01-07 14:18:51 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:18:51.523481800"}
2026-01-07 14:18:56 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:18:56.537208700"}
2026-01-07 14:19:01 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:19:01.540388600"}
2026-01-07 14:19:06 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:19:06.545960100"}
2026-01-07 14:19:11 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:19:11.560087500"}
2026-01-07 14:19:16 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:19:16.562771"}
2026-01-07 14:19:21 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:19:21.564232700"}
2026-01-07 14:19:26 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:19:26.575374800"}
2026-01-07 14:19:31 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:19:31.579091300"}
2026-01-07 14:19:36 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:19:36.585219200"}
2026-01-07 14:19:41 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:19:41.596970800"}
2026-01-07 14:19:46 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:19:46.610687400"}
2026-01-07 14:19:51 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:19:51.615095600"}
2026-01-07 14:19:56 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:19:56.619667400"}
2026-01-07 14:20:01 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:20:01.624715600"}
2026-01-07 14:20:06 [scheduling-1] DEBUG com.inzy.wsmock.ScheduledPushTask.pushMsgToClients - msgObj = {"content":"定时推送消息 - 2026-01-07T14:20:06.629201100"}
2026-01-07 14:20:08 [DefaultDispatcher-worker-1] INFO c.inzy.wsmock.NettyWebSocketServer.invokeSuspend - Netty线程组已关闭
2026-01-07 14:20:08 [SpringApplicationShutdownHook] INFO c.inzy.wsmock.NettyWebSocketServer.stop - Netty WebSocket服务已关闭
2026-01-07 14:20:12 [main] INFO com.inzy.wsmock.WsmockApplicationKt.logStarting - Starting WsmockApplicationKt using Java 17.0.15 with PID 10400 (D:\JavaWorkSpace\wsmock\build\classes\kotlin\main started by Administrator in D:\JavaWorkSpace\wsmock)
2026-01-07 14:20:12 [main] INFO com.inzy.wsmock.WsmockApplicationKt.logStartupProfileInfo - No active profile set, falling back to 1 default profile: "default"
2026-01-07 14:20:13 [main] INFO o.a.catalina.core.StandardService.log - Starting service [Tomcat]
2026-01-07 14:20:13 [main] INFO o.a.catalina.core.StandardEngine.log - Starting Servlet engine: [Apache Tomcat/10.1.50]
2026-01-07 14:20:13 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/].log - Initializing Spring embedded WebApplicationContext
2026-01-07 14:20:13 [DefaultDispatcher-worker-1] INFO c.inzy.wsmock.NettyWebSocketServer.invokeSuspend - Netty WebSocket服务启动成功,端口:8089
2026-01-07 14:20:13 [main] INFO com.inzy.wsmock.WsmockApplicationKt.logStarted - Started WsmockApplicationKt in 1.168 seconds (process running for 1.455)
2026-01-07 14:21:05 [DefaultDispatcher-worker-1] INFO c.inzy.wsmock.NettyWebSocketServer.invokeSuspend - Netty线程组已关闭
2026-01-07 14:21:05 [SpringApplicationShutdownHook] INFO c.inzy.wsmock.NettyWebSocketServer.stop - Netty WebSocket服务已关闭
...@@ -13,6 +13,10 @@ import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler ...@@ -13,6 +13,10 @@ import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler
import io.netty.handler.stream.ChunkedWriteHandler import io.netty.handler.stream.ChunkedWriteHandler
import jakarta.annotation.PostConstruct import jakarta.annotation.PostConstruct
import jakarta.annotation.PreDestroy import jakarta.annotation.PreDestroy
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Value import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
...@@ -21,47 +25,52 @@ class NettyWebSocketServer( ...@@ -21,47 +25,52 @@ class NettyWebSocketServer(
@Value("\${netty.websocket.port:8089}") private val port: Int, @Value("\${netty.websocket.port:8089}") private val port: Int,
private val webSocketHandler: WebSocketHandler private val webSocketHandler: WebSocketHandler
) { ) {
private val logger = LoggerFactory.getLogger(javaClass)
// Netty主从线程组 // Netty主从线程组
private val bossGroup = NioEventLoopGroup(1) private val bossGroup = NioEventLoopGroup(1)
private val workerGroup = NioEventLoopGroup() private val workerGroup = NioEventLoopGroup()
// 保存Netty服务的ChannelFuture,用于优雅关闭
private var serverChannelFuture: io.netty.channel.ChannelFuture? = null
/** /**
* 启动Netty WebSocket服务 * 启动Netty WebSocket服务(异步执行,避免阻塞Spring主线程)
*/ */
@PostConstruct @PostConstruct
fun start() { fun start() {
try { // 🔥 关键修改:使用新线程启动Netty,不阻塞Spring初始化
val bootstrap = ServerBootstrap() CoroutineScope(Dispatchers.IO).launch {
bootstrap.group(bossGroup, workerGroup) try {
.channel(NioServerSocketChannel::class.java) val bootstrap = ServerBootstrap()
.option(ChannelOption.SO_BACKLOG, 1024) bootstrap.group(bossGroup, workerGroup)
.childOption(ChannelOption.SO_KEEPALIVE, true) .channel(NioServerSocketChannel::class.java)
.childHandler(object : ChannelInitializer<SocketChannel>() { .option(ChannelOption.SO_BACKLOG, 1024)
override fun initChannel(ch: SocketChannel) { .childOption(ChannelOption.SO_KEEPALIVE, true)
val pipeline = ch.pipeline() .childHandler(object : ChannelInitializer<SocketChannel>() {
// HTTP编解码器 override fun initChannel(ch: SocketChannel) {
pipeline.addLast(HttpServerCodec()) val pipeline = ch.pipeline()
// 分块写处理器 pipeline.addLast(HttpServerCodec())
pipeline.addLast(ChunkedWriteHandler()) pipeline.addLast(ChunkedWriteHandler())
// HTTP消息聚合器(最大1024*1024字节) pipeline.addLast(HttpObjectAggregator(1024 * 1024))
pipeline.addLast(HttpObjectAggregator(1024 * 1024)) pipeline.addLast(WebSocketServerProtocolHandler("/gs-guide-websocket"))
// WebSocket协议处理器(指定WebSocket路径) pipeline.addLast(webSocketHandler)
pipeline.addLast(WebSocketServerProtocolHandler("/gs-guide-websocket")) }
// 自定义WebSocket消息处理器 })
pipeline.addLast(webSocketHandler) // 绑定端口并启动(非阻塞?不,这里sync()只阻塞当前新线程,不阻塞Spring主线程)
} serverChannelFuture = bootstrap.bind(port).sync()
}) logger.info("Netty WebSocket服务启动成功,端口:$port")
// 绑定端口并启动
val channelFuture = bootstrap.bind(port).sync() // 阻塞当前新线程(而非Spring主线程)直到服务关闭
println("Netty WebSocket服务启动成功,端口:$port") serverChannelFuture?.channel()?.closeFuture()?.sync()
// 阻塞直到服务关闭 } catch (e: Exception) {
channelFuture.channel().closeFuture().sync() logger.error("Netty服务启动失败", e)
} catch (e: Exception) { } finally {
e.printStackTrace() // 优雅关闭线程组
} finally { bossGroup.shutdownGracefully()
// 优雅关闭线程组 workerGroup.shutdownGracefully()
bossGroup.shutdownGracefully() logger.info("Netty线程组已关闭")
workerGroup.shutdownGracefully() }
} }
} }
...@@ -70,8 +79,10 @@ class NettyWebSocketServer( ...@@ -70,8 +79,10 @@ class NettyWebSocketServer(
*/ */
@PreDestroy @PreDestroy
fun stop() { fun stop() {
// 主动关闭Netty服务,解除closeFuture的阻塞
serverChannelFuture?.channel()?.close()?.sync()
bossGroup.shutdownGracefully() bossGroup.shutdownGracefully()
workerGroup.shutdownGracefully() workerGroup.shutdownGracefully()
println("Netty WebSocket服务已关闭") logger.info("Netty WebSocket服务已关闭")
} }
} }
\ No newline at end of file
...@@ -6,7 +6,7 @@ import java.util.concurrent.atomic.AtomicBoolean ...@@ -6,7 +6,7 @@ import java.util.concurrent.atomic.AtomicBoolean
@Component @Component
class PushConfig { class PushConfig {
// 定时推送开关(默认关闭) // 定时推送开关(默认关闭)
val pushEnabled = AtomicBoolean(false) val pushEnabled = AtomicBoolean(true)
// 推送间隔(毫秒,默认5秒) // 推送间隔(毫秒,默认5秒)
var pushInterval: Long = 5000 var pushInterval: Long = 5000
} }
\ No newline at end of file
...@@ -2,21 +2,28 @@ package com.inzy.wsmock ...@@ -2,21 +2,28 @@ package com.inzy.wsmock
import com.alibaba.fastjson2.JSONObject import com.alibaba.fastjson2.JSONObject
import lombok.extern.slf4j.Slf4j
import org.slf4j.LoggerFactory
import org.springframework.scheduling.annotation.Scheduled import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.time.LocalDateTime import java.time.LocalDateTime
@Slf4j
@Component @Component
class ScheduledPushTask( class ScheduledPushTask(
private val webSocketHandler: WebSocketHandler, private val webSocketHandler: WebSocketHandler,
private val pushConfig: PushConfig private val pushConfig: PushConfig
) { ) {
private val logger = LoggerFactory.getLogger(javaClass)
/** /**
* 定时推送任务(固定延迟,避免任务叠加) * 定时推送任务(固定延迟,避免任务叠加)
*/ */
// @Scheduled(fixedDelayString = "#{@pushConfig.pushInterval}") @Scheduled(fixedDelayString = "#{@pushConfig.pushInterval}")
@Scheduled(fixedRate = 1000)
fun pushMsgToClients() { fun pushMsgToClients() {
// 增加日志,确认函数是否执行
// logger.info("定时推送任务开始执行 - ${LocalDateTime.now()}")
// 开关关闭时跳过 // 开关关闭时跳过
// if (!pushConfig.pushEnabled.get()) { // if (!pushConfig.pushEnabled.get()) {
// return // return
...@@ -24,7 +31,7 @@ class ScheduledPushTask( ...@@ -24,7 +31,7 @@ class ScheduledPushTask(
// 构造推送消息(适配前端格式) // 构造推送消息(适配前端格式)
val msgObj = JSONObject() val msgObj = JSONObject()
msgObj["content"] = "定时推送消息 - ${LocalDateTime.now()}" msgObj["content"] = "定时推送消息 - ${LocalDateTime.now()}"
println("--------msgObj = ${msgObj}") logger.debug("msgObj = ${msgObj}")
// 广播给所有客户端 // 广播给所有客户端
webSocketHandler.broadcastMsg(msgObj.toJSONString()) webSocketHandler.broadcastMsg(msgObj.toJSONString())
} }
......
...@@ -2,6 +2,7 @@ package com.inzy.wsmock ...@@ -2,6 +2,7 @@ package com.inzy.wsmock
import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication import org.springframework.boot.runApplication
import org.springframework.context.annotation.ComponentScan
import org.springframework.scheduling.annotation.EnableScheduling import org.springframework.scheduling.annotation.EnableScheduling
@SpringBootApplication @SpringBootApplication
......
...@@ -13,6 +13,34 @@ server: ...@@ -13,6 +13,34 @@ server:
force: true force: true
logging:
# 全局日志级别
level:
root: INFO
io.netty: WARN
org.springframework: WARN
# 包级别日志
# com.inzy.wsmock: DEBUG
# org.springframework: WARN
# org.hibernate: ERROR
# 类级别日志
# com.example.service.UserService: TRACE
# 日志文件配置
file:
name: logs/wsmock.log
# 日志格式
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36}.%method - %msg%n"
logback:
rollingpolicy:
max-file-size: 10MB
max-history: 30
total-size-cap: 1GB
file-name-pattern: logs/wsmock-.%d{yyyy-MM-dd}.%i.log
# Netty WebSocket配置 # Netty WebSocket配置
netty: netty:
websocket: websocket:
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment