Java 将异步合成消息注入入站通道处理程序管道

Java 将异步合成消息注入入站通道处理程序管道,java,netty,Java,Netty,我有一个netty客户端从TCP连接读取消息,我想将合成消息添加到管道中,由处理程序像处理普通消息一样处理 消息将使用定期计时器每秒注入一次,即这些消息与传入消息异步,因此我必须手动调用管道,而不等待tcp流量,但它肯定必须同步,因此管道处理程序不会同时被调用 在下面的简单示例管道中,消息必须在1之后插入。(因为否则帧解码器会混淆),但在2之前。(因为除了常规消息外,它还应该处理合成消息) 如何做到这一点?您可以通过获取对处理程序的ChannelHandlerContext的引用来做到这一点,

我有一个netty客户端从TCP连接读取消息,我想将合成消息添加到管道中,由处理程序像处理普通消息一样处理

消息将使用定期计时器每秒注入一次,即这些消息与传入消息异步,因此我必须手动调用管道,而不等待tcp流量,但它肯定必须同步,因此管道处理程序不会同时被调用

在下面的简单示例管道中,消息必须在1之后插入。(因为否则帧解码器会混淆),但在2之前。(因为除了常规消息外,它还应该处理合成消息)


如何做到这一点?

您可以通过获取对处理程序的ChannelHandlerContext的引用来做到这一点,该处理程序正好位于要注入合成消息的上游。要插入消息时,请调用上下文的
fireChannelRead(Object)
方法,该方法调用管道中下一个入站处理程序的
channelRead
方法

Netty将负责确保在正确的线程中处理消息。(如果您已经在通道的事件循环线程中,则会立即调用下一个处理程序;否则,将计划在下一个可用机会在通道的事件循环线程上进行调用)

在本例中,您需要
帧解码器
处理程序的上下文
ChannelPipeline
有几个重载的“context”方法,用于返回处理程序的上下文。在本例中,假设您为处理程序指定了名称“frame decoder”,我们将使用该名称查找上下文。(或者,您可以通过传递对处理程序对象本身的引用或传递处理程序的
类来查找它。)


仔细观察之后,很明显Netty将负责在正确的线程中触发“通道读取”事件(使用与此答案的初始版本非常类似的代码),因此您不必担心这一部分。事实证明,您甚至不需要创建自定义处理程序,因为您可以从管道中获取任何处理程序的上下文。就像一个符咒一样工作。也谢谢你的跟进和简化——它也简化了我的实际代码!
public static void injectMessage(ChannelPipeline pipeline,
                                 Object message) {
    ChannelHandlerContext ctx = pipeline.context("frame-decoder");
    ctx.fireChannelRead(message);
}