我正在使用 Netty 编写一个简单的服务器应用程序。它将接受长时间运行的套接字连接(即 telnet/ssh)...接收基于字符串的命令并发送基于字符串的响应。
我需要跟踪一些 session 状态,关于该套接字连接客户端上的特定实体。我不清楚该怎么做。
channel 处理程序,通过传递给其channelRead(...)
方法的ChannelHandlerContext
对象,可以访问“属性”。然而,这似乎是为了在 channel 处理程序级别设置状态,而不是每个套接字连接级别。 AttributeMap
的 Javadocs 明确指出:“请注意,不可能 [sic] 具有多个具有相同名称的键”。大多数示例都将其用于简单的“计数器”插图。
在 Netty 的早期版本中有一个 ChannelLocal
类,它可能是相关的。但它已从 Netty 4.x 中删除,我认为它也是针对处理程序级状态而不是连接级状态。
有没有办法拥有每个连接的状态,同时仍然在您的 channel 处理程序类上使用 @Sharable
注释,并充分利用 Netty 的非阻塞优势?或者这个用例的方法是简单地将实例变量放在您的 channel 处理程序上,删除 @Shareable
注释,并为每个传入连接生成一个新的连接处理程序(以及新线程?)?
最佳答案
Channel
确实扩展了 AttributeMap
,因此您只需在 channel 上设置/获取属性即可。
Channel
是套接字连接的抽象。
另一方面,为每个 Channel
创建一个 ChannelHandler
并在它们的字段中保存状态并没有错。 ChannelHandler
与线程无关,它们由 EventLoop
抽象,每个 Channel
只有一个 EventLoop
>.
实际上恰恰相反:ChannelHandler
保证被同一个线程调用(Channel
的事件循环,或者当将处理程序添加到 Pipeline
)。由于这一点,您既不需要同步,也不需要 channel 处理程序字段的 volatile 限定符。
关于java - 使用 Netty,如何存储每个套接字连接的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48486867/