fireUserEventTriggered 是 "glue" 使用 netty 管道提供非 netty 回调提供服务的正确方法吗?

Is fireUserEventTriggered correct way to "glue" non-netty callback-providing services with netty pipline?

美好的一天!

想知道在通道处理程序中处理消息时使用 fireUserEventTriggered/userEventTriggered 是否是与面向回调的外部服务协作的净方式?

我的意思是,如果有一些具有 nonblocking(回调机制) 方法的“外星人”服务,这是调用 ChannelHandlerContext#fireUserEventTriggered[ 的正确方法吗? =38=](从回调闭包中传递一些参数),然后在重载的 ChannelInboundHandler#userEventTriggered 中处理它,以便在所有开始的原始通道中继续通信。

说明示例

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {

        externalServiceWithAsyncApi.doAndRegisterCallback(
            //some call that will finish later and trigger callback handler
            (callbackParam)-> 
                ctx.fireUserEventTriggered(
                    new ExternalServiceCallbackEvent(callbackParam)
                )
        );

    }

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        //seems its for us to handle
        if (evt instanceof ExternalServiceCallbackEvent) {
            //some processing and answer in the original?
            ctx.channel()
                .writeAndFlush(...)
                .addListener(...);

        // let other handlers process
        } else {
            super.userEventTriggered(ctx, evt);
        }
    }

“Netty 实战”(清单 11.7 中)中的 HeartbeatHandler 示例似乎是相关的,但这部分与我目前的阅读观点相比有点超前,因此决定寻求帮助。

有一个非常相似的问题,但有些东西对作者不起作用,也没有答案Netty, writing to channel from non-Netty thread

UPD

正确的方法似乎是调用 NOT

ctx.fireUserEventTriggered(...)

但是

ctx.channel().pipeline().fireUserEventTriggered(...)

这绝对是您可以用来做这件事的东西。也就是说,您也可以直接从回调中进行写入。