将异步的合成消息注入入站通道处理程序管道
Inject asynchronous, synthetic messages into inbound channel handler pipeline
我有一个 netty 客户端从 TCP 连接读取消息,我想将合成消息添加到管道中,以便处理程序像处理普通消息一样处理。
消息将使用周期性计时器每秒注入一次,即这些消息与传入消息异步,因此我必须以某种方式手动调用管道,而无需等待 tcp 流量,但它会当然必须同步,这样管道处理程序就不会被同时调用。
在下面的简单示例管道中,必须在 1 之后插入消息。(否则帧解码器会混淆),但在 2 之前。(因为它应该处理合成消息,除了常规的)。
如何做到这一点?
您可以通过获取对位于要注入合成消息的上游的处理程序的 ChannelHandlerContext 的引用来执行此操作。当您要插入消息时,调用上下文的 fireChannelRead(Object)
方法,该方法会调用管道中 next 入站处理程序的 channelRead
方法。
Netty 将负责确保在正确的线程中处理消息。 (如果您已经在通道的事件循环线程中,将立即调用下一个处理程序;否则调用将安排在下一个可用机会时发生在通道的事件循环线程中)。
在您的情况下,您需要 frame-decoder
处理程序的上下文。 ChannelPipeline
有一些重载的“上下文”方法,return 处理程序的上下文。在此示例中,假设您已为处理程序指定名称“frame-decoder”,我们将使用此名称查找上下文。 (或者,您可以通过传递对处理程序对象本身的引用或通过传递处理程序的 Class
来查找它。)
public static void injectMessage(ChannelPipeline pipeline,
Object message) {
ChannelHandlerContext ctx = pipeline.context("frame-decoder");
ctx.fireChannelRead(message);
}
我有一个 netty 客户端从 TCP 连接读取消息,我想将合成消息添加到管道中,以便处理程序像处理普通消息一样处理。
消息将使用周期性计时器每秒注入一次,即这些消息与传入消息异步,因此我必须以某种方式手动调用管道,而无需等待 tcp 流量,但它会当然必须同步,这样管道处理程序就不会被同时调用。
在下面的简单示例管道中,必须在 1 之后插入消息。(否则帧解码器会混淆),但在 2 之前。(因为它应该处理合成消息,除了常规的)。
如何做到这一点?
您可以通过获取对位于要注入合成消息的上游的处理程序的 ChannelHandlerContext 的引用来执行此操作。当您要插入消息时,调用上下文的 fireChannelRead(Object)
方法,该方法会调用管道中 next 入站处理程序的 channelRead
方法。
Netty 将负责确保在正确的线程中处理消息。 (如果您已经在通道的事件循环线程中,将立即调用下一个处理程序;否则调用将安排在下一个可用机会时发生在通道的事件循环线程中)。
在您的情况下,您需要 frame-decoder
处理程序的上下文。 ChannelPipeline
有一些重载的“上下文”方法,return 处理程序的上下文。在此示例中,假设您已为处理程序指定名称“frame-decoder”,我们将使用此名称查找上下文。 (或者,您可以通过传递对处理程序对象本身的引用或通过传递处理程序的 Class
来查找它。)
public static void injectMessage(ChannelPipeline pipeline,
Object message) {
ChannelHandlerContext ctx = pipeline.context("frame-decoder");
ctx.fireChannelRead(message);
}