You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:37:39