Spring Reactive的ReactorNettyWebSocketClient无日志输出问题求助
排查ReactorNettyWebSocketClient无日志输出的问题
咱们一步步来排查这个问题,结合你的代码片段,我整理了几个常见的原因和对应的解决办法:
1. 先确认日志配置是否正确开启
Reactor Netty的底层日志依赖SLF4J(比如搭配Logback或Log4j2),而且需要把相关包的日志级别调到DEBUG才能看到连接、消息收发的细节。
- 如果用Spring Boot的
application.properties,添加这两行:logging.level.reactor.netty=DEBUG logging.level.io.netty=DEBUG - 如果是Logback的XML配置,要添加对应的logger节点:
<logger name="reactor.netty" level="DEBUG"/> <logger name="io.netty" level="DEBUG"/>
这样才能触发底层WebSocket交互的日志输出。
2. 检查WebSocket会话的处理逻辑是否完整
你的代码片段里client.execute的会话处理部分没写完,而且Reactor的流是懒加载的——如果不订阅整个流,代码根本不会执行,自然也不会有日志。
修正后的完整示例代码如下:
@Bean CommandLineRunner demo() { return args -> { Flux<String> input = Flux.<String>generate(sink -> sink.next("This is a test")) .delayElements(Duration.ofSeconds(1)); WebSocketClient client = new ReactorNettyWebSocketClient(); client.execute(new URI("ws://echo.websocket.org"), session -> // 发送消息 session.send(input.map(session::textMessage)) // 同时处理服务器的回消息 .thenMany(session.receive() .map(WebSocketMessage::getPayloadAsText) .doOnNext(msg -> System.out.println("Received echo: " + msg)) // 手动打印或用SLF4J Logger记录 .then()) // 捕获错误并输出 .doOnError(error -> System.err.println("WebSocket error: " + error.getMessage())) // 会话完成时的日志 .doOnComplete(() -> System.out.println("WebSocket session finished")) .block()); // 阻塞等待,避免CommandLineRunner执行完直接退出 }; }
这里要注意两个关键点:
- 必须调用
block()或者显式订阅(.subscribe())整个流,否则程序启动后直接退出,WebSocket连接还没建立就结束了; - 通过
doOnNext、doOnError等操作符显式添加日志逻辑,确保消息收发、异常情况都能被记录。
3. 验证依赖是否齐全
确保你的项目里已经引入了Reactor Netty和日志相关的依赖:
Maven 依赖:
<!-- Reactor Netty WebSocket --> <dependency> <groupId>io.projectreactor.netty</groupId> <artifactId>reactor-netty</artifactId> </dependency> <!-- SLF4J API --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <!-- Logback 日志实现 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency>
Gradle 依赖:
implementation 'io.projectreactor.netty:reactor-netty' implementation 'org.slf4j:slf4j-api' implementation 'ch.qos.logback:logback-classic'
4. 确认WebSocket服务器是否可达
有时候ws://echo.websocket.org可能存在访问问题,导致连接失败但没有日志。你可以先用浏览器的WebSocket测试工具(比如Chrome控制台的new WebSocket("ws://echo.websocket.org"))验证服务器是否能正常连接。如果不行,可以换成其他公开的echo服务器,比如ws://echo.websocket.events。
内容的提问来源于stack exchange,提问作者Jdruwe
相关产品推荐
相关产品推荐

