这个错误是 Netty 中常见的死锁检测异常。 当你在 EventLoop 线程中同步等待一个操作完成时,Netty 会检测到这可能造成死锁并抛出 BlockingOperationException。
[2025-11-15 14:15:23.551][WARN][nioEventLoopGroup-2-1]-> channelHandler异常 io.netty.util.concurrent.BlockingOperationException: DefaultChannelPromise@314f4aa6(incomplete) at io.netty.util.concurrent.DefaultPromise.checkDeadLock(DefaultPromise.java:386) ~[netty-all-4.1.36.Final.jar:4.1.36.Final] at io.netty.channel.DefaultChannelPromise.checkDeadLock(DefaultChannelPromise.java:159) ~[netty-all-4.1.36.Final.jar:4.1.36.Final] at io.netty.util.concurrent.DefaultPromise.awaitUninterruptibly(DefaultPromise.java:236) ~[netty-all-4.1.36.Final.jar:4.1.36.Final] at io.netty.channel.DefaultChannelPromise.awaitUninterruptibly(DefaultChannelPromise.java:137) ~[netty-all-4.1.36.Final.jar:4.1.36.Final] at io.netty.channel.DefaultChannelPromise.awaitUninterruptibly(DefaultChannelPromise.java:30) ~[netty-all-4.1.36.Final.jar:4.1.36.Final] at io.netty.util.concurrent.DefaultPromise.syncUninterruptibly(DefaultPromise.java:335) ~[netty-all-4.1.36.Final.jar:4.1.36.Final] at io.netty.channel.DefaultChannelPromise.syncUninterruptibly(DefaultChannelPromise.java:125) ~[netty-all-4.1.36.Final.jar:4.1.36.Final] at io.netty.channel.DefaultChannelPromise.syncUninterruptibly(DefaultChannelPromise.java:30) ~[netty-all-4.1.36.Final.jar:4.1.36.Final] at cn.xxx.client.service.ClientXXXService.doUploadUnpkgLog(ClientXXXService.java:337) ~[xxx-client-1.6.29.jar:?] at cn.xxx.client.netty.handler.xxxClientChannelHandler.handlerDataHeader(xxxClientChannelHandler.java:198) ~[xxx-client-1.6.29.jar:?] at cn.xxx.common.netty.channel.BytesCommandChannelInboundHandler.readBytesCommand(BytesCommandChannelInboundHandler.java:106) ~[xxx-common-client-1.2.18.jar:?] at cn.xxx.common.netty.channel.BytesCommandChannelInboundHandler.channelRead(BytesCommandChannelInboundHandler.java:91) ~[xxx-common-client-1.2.18.jar:?] ------------------------------ 这里是因为BytesCommandChannelInboundHandler是使用IO线程执行的, 它调用了另外一个service的方法,里面又发送消息,还使用了syncUninterruptibly()方法, 也就是同步等待,所以netty认为死锁。
解决办法: 调用service扔到线程池里,异步执行。
|