首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Java

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

  •  
  •   gramyang · 172 天前 · 1337 次点击
    这是一个创建于 172 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    9 回复  |  直到 2019-04-26 10:28:51 +08:00
        1
    cyhulk   172 天前
    放到 redis 里面和直接写一个静态类,然后里面放数据有什么区别?
        2
    gramyang   172 天前
    @cyhulk 最好是可以让指定的 channel 来访问,对其他的 channel 屏蔽,这样该怎么实现呢
        3
    cyhulk   172 天前
    @gramyang 一个 map 结构存储数据,每个 channel 的 attribute 里面存这个 key。抛砖引玉
        4
    mortonnex   172 天前
    把要共享的数据写到一个的类中,所有 channel 都可以访问
        5
    gramyang   172 天前
    @mortonnex 我是把共享的 concurrenthashmap 放在初始化 ServerBootstrap 的类中,这样理论上所有的 channel 都可以访问到。
        6
    gramyang   172 天前
    @cyhulk 嗯,是的,只有这种方法了。我本来想着继承一下 eventloopgroup,往里面塞个 map 什么的,现在看来没必要,而且也不知道可不可行
        7
    mortonnex   172 天前
    @gramyang
    这样就耦合了
    建议单独搞一个类,例如叫 ShareCache.java
    你要共享的数据设为静态成员变量,就可以直接访问了
        8
    guyeu   172 天前
    ThreadLocal ?
        9
    deming   171 天前
    ChannelHandler 可以设成共享模式,增加 @Sharable 注解,但是自己要控制线程安全问题。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2169 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 23ms · UTC 15:41 · PVG 23:41 · LAX 08:41 · JFK 11:41
    ♥ Do have faith in what you're doing.