gramyang
V2EX  ›  Java

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

  •  
  •   gramyang · Apr 25, 2019 · 3599 views
    This topic created in 2587 days ago, the information mentioned may be changed or developed.

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

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

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

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