在Netty 4中使用LocalChannel在线程之间共享状态

时间:2014-12-23 22:33:29

标签: java netty multicast channel jgroups

我正在使用Netty 4构建POC,只是一个基本的客户端/服务器设置;我的问题是如何在服务器进程本身内有效地共享状态,让我解释一下......

服务器

服务器没什么特别的;使用bossworkers事件循环组接受远程连接的标准逻辑(代码未显示)。

有趣的地方

服务器支持可插拔模块,提供指标和组管理服务。这些模块作为子线程自主运行,定期生成对服务器正常运行很重要的信息;这是我不确定该做什么的地方;如何以“netty”方式从线程模块生成信息到服务器进程。

天真的方法

本地VM频道

查看示例LocalEcho,它显示LocalChannelLocalServerChannel提供VM(内存中)通信,但我希望这些频道更容易设置,但这里有:

//in-memory server
EventLoopGroup serverGroup = new DefaultEventLoopGroup();

ServerBootstrap svm = new ServerBootstrap();
   svm.group(serverGroup)
     .channel(LocalServerChannel.class)
      .handler(new ChannelInitializer<LocalServerChannel>() {
         @Override
         public void initChannel(LocalServerChannel ch) throws Exception {
            ch.pipeline().addLast(new LoggingHandler(LogLevel.INFO))
         }
      })
     .childHandler(new ChannelInitializer<LocalChannel>() {
         @Override
         public void initChannel(LocalChannel ch) throws Exception {
            ch.pipeline().addLast( EventsFromModule_Handler());
         }
      });

    //start server vm
    svm.bind(addr).sync();

//in-memory client
EventLoopGroup clientGroup = new NioEventLoopGroup(); 
Bootstrap cvm = new Bootstrap();
  cvm.group(clientGroup)
    .channel(LocalChannel.class)
    .handler(new ChannelInitializer<LocalChannel>() {
       @Override 
       public void initChannel(LocalChannel ch) throws Exception {
         ch.pipeline().addLast(
            new DefaultModuleHandler());
       }
     });

连接模块

这是我创建和分叉模块的地方;首先,我从客户端vm获取一个通道,将其传递给模块..

Channel mch = cvm.connect(addr).sync().channel();
ModuleFactory.fork( 
   new DiscoveryService( mch), 
   ) 

...现在该模块有一个用于生成事件的专用通道;这些事件将由EventsFromModule_Handler()处理,弥合模块和(服务器)进程之间的差距。

问题

我对netty很新,但在这种情况下使用LocalChannel是一种有效的方法吗? 我做错了吗?

0 个答案:

没有答案