[英]With Netty, how can you store state per socket connection?
我正在使用Netty编写一个简单的服务器应用程序。 它将接受长时间运行的套接字连接(即telnet / ssh)...接收基于字符串的命令并发送基于字符串的响应。
我需要跟踪有关该套接字连接客户端上的特定实体的某些会话状态。 我不清楚该如何处理。
通道处理程序通过传递到其channelRead(...)
方法的ChannelHandlerContext
对象,可以访问“属性”。 但是,这似乎是为了在通道处理程序级别而不是每个套接字连接级别设置状态。 AttributeMap
的Javadocs明确指出:“ 请注意,不可能有多个具有相同名称的键 ”。 那里的大多数示例都将其用于简单的“计数器”插图。
Netty的早期版本中有一个ChannelLocal
类,可能是相关的。 但是从Netty 4.x开始已将其删除,我认为它也适用于处理程序级别的状态,而不是连接级别的状态。
有没有一种方法可以使每个连接处于状态,同时仍在通道处理程序类上使用@Sharable
注释,并充分利用Netty的非阻塞性优势? 还是这种用例的方法仅仅是将实例变量放在通道处理程序上,删除@Shareable
批注,并为每个传入的连接生成一个新的连接处理程序(并因此产生新的线程?)?
Channel
确实扩展了AttributeMap
,因此您只需在通道上设置/获取属性即可。 Channel
是套接字连接的抽象。
另一方面,为每个Channel
创建一个ChannelHandler
并在其字段中保存状态没有错。 ChannelHandler
与线程无关,这些线程由EventLoop
抽象,并且每个Channel
仅一个EventLoop
。
实际上是另一ChannelHandler
:确保由同一线程( Channel
的事件循环,或在将处理程序添加到Pipeline
时指定的事件循环)调用ChannelHandler
。 因此,您不需要同步,也不需要通道处理程序的字段的volatile限定符。
您应该使用@Sharable
注释ChannelHandler
,然后使用attr()
将特定于连接的属性存储在ChannelHandlerContext
。 在ChannelHandlerContext
文档中对此进行了很好的解释:“一个处理程序可以具有多个上下文”。
不要使用ThreadPerChannelEventLoop
,它会破坏线程模型的抽象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.