netty:多个 channel 如何共享数据??

2019-04-25 18:11:55 +08:00
 gramyang

netty 中每个 channel 对应一个 pipeline,pipeline 上面注册有多个 handler (也就是 channelhandlercontext ),handler 之间传递数据的方式就是实现了 inbound 或者 outbound 接口后直接 write。

现在的问题是:netty 中如何创建同一个 evenloop 中多个 channel 能够共享的变量?? 我看到一个 demo 里面是在 handler 中将该变量声明成 volatile,但是我感觉可能不太对,在网上搜资料也没找到什么可行的方案。

难道真的要写到 redis 里面去吗?

3037 次点击
所在节点    Java
11 条回复
cyhulk
2019-04-25 18:22:23 +08:00
放到 redis 里面和直接写一个静态类,然后里面放数据有什么区别?
gramyang
2019-04-25 18:25:03 +08:00
@cyhulk 最好是可以让指定的 channel 来访问,对其他的 channel 屏蔽,这样该怎么实现呢
cyhulk
2019-04-25 18:31:04 +08:00
@gramyang 一个 map 结构存储数据,每个 channel 的 attribute 里面存这个 key。抛砖引玉
mortonnex
2019-04-25 18:32:29 +08:00
把要共享的数据写到一个的类中,所有 channel 都可以访问
gramyang
2019-04-25 18:34:46 +08:00
@mortonnex 我是把共享的 concurrenthashmap 放在初始化 ServerBootstrap 的类中,这样理论上所有的 channel 都可以访问到。
gramyang
2019-04-25 18:36:00 +08:00
@cyhulk 嗯,是的,只有这种方法了。我本来想着继承一下 eventloopgroup,往里面塞个 map 什么的,现在看来没必要,而且也不知道可不可行
mortonnex
2019-04-25 19:11:54 +08:00
@gramyang
这样就耦合了
建议单独搞一个类,例如叫 ShareCache.java
你要共享的数据设为静态成员变量,就可以直接访问了
guyeu
2019-04-25 21:20:52 +08:00
ThreadLocal ?
deming
2019-04-26 10:28:51 +08:00
ChannelHandler 可以设成共享模式,增加 @Sharable 注解,但是自己要控制线程安全问题。
mazai
2019-12-02 18:52:25 +08:00
实际上 Channel 已经帮你维护了一个 AttributeMap,里面可以放一些业务的数据,且是线程安全的,无须担心并发问题。
mazai
2019-12-02 18:54:10 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/558704

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX