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

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

  •  
  •   gramyang · 2019-04-25 18:11:55 +08:00 · 3067 次点击
    这是一个创建于 2068 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    11 条回复    2019-12-02 18:54:10 +08:00
    cyhulk
        1
    cyhulk  
       2019-04-25 18:22:23 +08:00
    放到 redis 里面和直接写一个静态类,然后里面放数据有什么区别?
    gramyang
        2
    gramyang  
    OP
       2019-04-25 18:25:03 +08:00
    @cyhulk 最好是可以让指定的 channel 来访问,对其他的 channel 屏蔽,这样该怎么实现呢
    cyhulk
        3
    cyhulk  
       2019-04-25 18:31:04 +08:00
    @gramyang 一个 map 结构存储数据,每个 channel 的 attribute 里面存这个 key。抛砖引玉
    mortonnex
        4
    mortonnex  
       2019-04-25 18:32:29 +08:00
    把要共享的数据写到一个的类中,所有 channel 都可以访问
    gramyang
        5
    gramyang  
    OP
       2019-04-25 18:34:46 +08:00
    @mortonnex 我是把共享的 concurrenthashmap 放在初始化 ServerBootstrap 的类中,这样理论上所有的 channel 都可以访问到。
    gramyang
        6
    gramyang  
    OP
       2019-04-25 18:36:00 +08:00
    @cyhulk 嗯,是的,只有这种方法了。我本来想着继承一下 eventloopgroup,往里面塞个 map 什么的,现在看来没必要,而且也不知道可不可行
    mortonnex
        7
    mortonnex  
       2019-04-25 19:11:54 +08:00
    @gramyang
    这样就耦合了
    建议单独搞一个类,例如叫 ShareCache.java
    你要共享的数据设为静态成员变量,就可以直接访问了
    guyeu
        8
    guyeu  
       2019-04-25 21:20:52 +08:00
    ThreadLocal ?
    deming
        9
    deming  
       2019-04-26 10:28:51 +08:00
    ChannelHandler 可以设成共享模式,增加 @Sharable 注解,但是自己要控制线程安全问题。
    mazai
        10
    mazai  
       2019-12-02 18:52:25 +08:00
    实际上 Channel 已经帮你维护了一个 AttributeMap,里面可以放一些业务的数据,且是线程安全的,无须担心并发问题。
    mazai
        11
    mazai  
       2019-12-02 18:54:10 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   917 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:41 · PVG 03:41 · LAX 11:41 · JFK 14:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.