Scala 动态添加websocket处理程序时的竞争条件

Scala 动态添加websocket处理程序时的竞争条件,scala,websocket,netty,Scala,Websocket,Netty,我正在用netty编写一个websocket,我的代码中似乎有一个竞争条件: 我有一个通道初始值设定项,用于构建管道,包括: ch.pipeline().addLast(新的HttpServerCodec()) ch.pipeline().addLast(新的HttpObjectAggregator(65536)) ch.pipeline().addLast(新的MyServer()) MyServer的工作原理如下: 如果它收到websocket升级请求,它将尝试验证该请求 如果失败,它将

我正在用netty编写一个websocket,我的代码中似乎有一个竞争条件:

我有一个通道初始值设定项,用于构建管道,包括:

ch.pipeline().addLast(新的HttpServerCodec())
ch.pipeline().addLast(新的HttpObjectAggregator(65536))
ch.pipeline().addLast(新的MyServer())
MyServer的工作原理如下:

  • 如果它收到websocket升级请求,它将尝试验证该请求
  • 如果失败,它将返回错误的请求
  • 如果成功,它将尝试:
    • 按照我的自定义逻辑处理程序添加websocket处理程序,完成握手并建立websocket连接
    • 这是使用以下代码完成的:
awareLogger.debug(日志“升级到websocket”)(日志上下文)
ctx.pipeline()
.addLast(新的WebSocketServerProtocolHandler(路由,true))
.addLast(新WebSocketFrameAggregator(65536))
.addLast(新的MyWebsocketLogic(logContext))
ctx.fireChannelRead(httpRequest)
val=awareLogger.debug(日志“升级到websocket”)(日志上下文)
它试图
fireChannelRead(httpRequest)
,希望
WebSocketServerProtocolHandler
能够拦截它并完成握手

我的问题是,
httpRequest
有时似乎一直传播到
MyWebsocketLogic
处理程序,无法建立连接和握手

我是不是做错了什么?这几乎就像我在代码中遇到某种竞争条件一样。

问题在于:

awareLogger.debug(日志“升级到websocket”)(日志上下文)
ctx.pipeline()
.addLast(新的WebSocketServerProtocolHandler(路由,true))
.addLast(新WebSocketFrameAggregator(65536))
.addLast(新的MyWebsocketLogic(logContext))
ctx.fireChannelRead(httpRequest)
val=awareLogger.debug(日志“升级到websocket”)(日志上下文)
在与指定给给定
ctx
的线程不同的线程中调用

我可以通过应用上面诺曼的建议来解决这个问题,即将管道修改切换到
频道的
EventLoop
,意思是:

ctx.channel().eventLoop().execute{()=>
val ux=ctx
1.管道()
.addLast(新的WebSocketServerProtocolHandler(路由,true))
.addLast(新WebSocketFrameAggregator(65536))
.addLast(buildWebsocketHandler(logContext,connectionHandler))
val=ctx.fireChannelRead(msg)
}

这似乎工作得很好

这段代码看起来非常好。。。我认为你应该尝试使用调试器来查看发生了什么on@NormanMaurer谢谢你的回答。管道修改是在与分配给通道的线程不同的线程中完成的(整个块在不同的线程池中执行)。。。您认为这会导致任何问题吗?为了更清楚,修改管道的整个代码块将在同一线程池上执行,但在分配给通道线程的不同线程池上执行。。。不仅仅是不同的线程,不同的线程池,我想这可以解释它。您是否可以尝试将其卸载到
频道的
EventLoop
channel.eventLoop().execute(…)
。将重试,谢谢