Netty 4-具有中央队列处理的单服务器、多客户端
我的情况如下:一个“服务器”有一个队列,将来自其他地方的消息(建模为传输字符串)放在该队列上。此队列将由连接到服务器的所有和任何客户端使用。每个客户机都可以看作是一种工作流/BPM引擎,即接收的字符串被转换为POJO,然后进行评估,以查看它是否符合标准,以及是否符合标准,并进行进一步处理 我正在尝试使用服务器-客户机方法,通过这种方法,客户机将服务器(承载队列)连接到服务器(后退以使用)。我为每个服务器和客户端设置了一个基本管道工厂:Netty 4-具有中央队列处理的单服务器、多客户端,netty,Netty,我的情况如下:一个“服务器”有一个队列,将来自其他地方的消息(建模为传输字符串)放在该队列上。此队列将由连接到服务器的所有和任何客户端使用。每个客户机都可以看作是一种工作流/BPM引擎,即接收的字符串被转换为POJO,然后进行评估,以查看它是否符合标准,以及是否符合标准,并进行进一步处理 我正在尝试使用服务器-客户机方法,通过这种方法,客户机将服务器(承载队列)连接到服务器(后退以使用)。我为每个服务器和客户端设置了一个基本管道工厂: 公共类ServerPipelineFactory扩展了通道初
公共类ServerPipelineFactory扩展了通道初始值设定项
{
@凌驾
public void initChannel(SocketChannel ch)引发异常
{
pipeline.addLast(“fieldLengthPrepender”,新LengthFieldPrepender(4));
addLast(“channelEventHandler”,新的ClientConnectHandler());
pipeline.addLast(
“gzipMessageDeflator”,
ZlibCodecFactory.newZlibEncoder(ZlibWrapper.GZIP)
);
}
}
公共类ClientConnectHandler扩展了SimpleChannelInboundHandler
{
public static final ChannelGroup allConnected=new DefaultChannelGroup(
GlobalEventExecutor.INSTANCE);
....
@凌驾
公共无效channelActive(ChannelHandlerContext ctx)引发异常
{
LOGGER.info(“客户连接”);
allConnected.add(ctx.channel());
超级通道激活(ctx);
}
}
服务器的设置方式(片段)如下所示:
。。。
EventLoopGroup bossGroup=新的NioEventLoopGroup(1);
EventLoopGroup workerGroup=新的NioEventLoopGroup();
ScheduledExecutorService svc=执行者。newSingleThreadScheduledExecutor();
尝试
{
ServerBootstrap b=新的ServerBootstrap();
b、 组(bossGroup,workerGroup).channel(NioServerSocketChannel.class)
.childHandler(新的ServerPipelineFactory());
Channel ch=b.bind(port.sync().Channel();
整数计数=0;
while(ClientConnectHandler.allConnected.isEmpty())
{
什么也不做
}
客户机-处理程序和工厂
@组成部分
@DependsOn({“clientSpringConfig”,“demoWorkflowProcessor”})
公共类ClientPipelineFactory扩展了通道初始值设定项
{
@凌驾
public void initChannel(SocketChannel ch)引发异常
{
ChannelPipeline=通道管道();
addLast(createInboundHandlers());
addLast(createOutboundHandlers());
addLast(createLogicHandlers());
}
...
私有ChannelHandler[]CreateLogicHandler()
{
列表处理程序=新的ArrayList(1);
ClientChannelHandler处理程序=
(ClientChannelHandler)AppContext.getBean(AppContext.CLIENT\u HANDLER);
添加(handler);
返回处理程序.toArray(新的ChannelHandler[1]);
}
}
公共类ClientChannelHandler扩展了SimpleChannelInboundHandler
{
@凌驾
受保护的无效channelRead0(ChannelHandlerContext ctx,字符串msg)引发异常
{
info(“添加队列:+msg”);
rcvdQueue.put(msg);
}
}
客户端上的队列由单独的ExecutorService实例读取和处理
我的服务器端@Component
消息发送者可以成功调用ClientConnectHandler.allConnected.writeAndFlush(buffer);
这将把从队列中检索到的元素写入所有通道-这不是我想要的。有人能帮我吗
我已经成功地让它在一个客户端->(发送消息“给我输入”)->服务器->(轮询队列)->(发送响应)->客户端->(坚持客户端处理队列)中工作,并从服务器向客户端进行“广播”,但我逃避的是没有客户端初始化消息的循环
提前感谢,
Al.建议采用与提供自定义ChannelGroup
实现相结合的方法,该实现使用Collections.rotate编写循环