gpt4 book ai didi

java - 将异步的合成消息注入(inject)入站 channel 处理程序管道

转载 作者:行者123 更新时间:2023-12-01 14:26:25 25 4
gpt4 key购买 nike

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

消息将使用周期性计时器每秒注入(inject)一次,即这些消息与传入消息异步,因此我必须以某种方式手动调用管道,而无需等待 tcp 流量,但它肯定会有进行同步,以便不会同时调用管道处理程序。

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

sample pipeline

如何做到这一点?

最佳答案

您可以通过在要注入(inject)合成消息的位置的上游获取对处理程序的 ChannelHandlerContext 的引用来执行此操作。当您要插入消息时,调用上下文的 fireChannelRead(Object) 方法,该方法会调用 next 入站处理程序的 channelRead 方法管道。

Netty 将负责确保消息在正确的线程中处理。 (如果您已经在 channel 的事件循环线程中,将立即调用下一个处理程序;否则调用将安排在下一个可用机会时在 channel 的事件循环线程中发生)。

在您的情况下,您需要 frame-decoder 处理程序的上下文。 ChannelPipeline 有一些重载的“上下文”方法,它们返回处理程序的上下文。在此示例中,假设您已为处理程序指定名称“frame-decoder”,我们将使用此名称查找上下文。 (或者,您可以通过传递对处理程序对象本身的引用或通过传递处理程序的 Class 来查找它。)

public static void injectMessage(ChannelPipeline pipeline,
Object message) {
ChannelHandlerContext ctx = pipeline.context("frame-decoder");
ctx.fireChannelRead(message);
}

关于java - 将异步的合成消息注入(inject)入站 channel 处理程序管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62785278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com