我正在使用Netty 4构建POC,只是一个基本的客户端/服务器设置;我的问题是如何在服务器进程本身内有效地共享状态,让我解释一下......
服务器没什么特别的;使用boss
和workers
事件循环组接受远程连接的标准逻辑(代码未显示)。
服务器支持可插拔模块,提供指标和组管理服务。这些模块作为子线程自主运行,定期生成对服务器正常运行很重要的信息;这是我不确定该做什么的地方;如何以“netty”方式从线程模块生成信息到服务器进程。
查看示例LocalEcho,它显示LocalChannel和LocalServerChannel提供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
是一种有效的方法吗?
我做错了吗?