Netty 4-具有中央队列处理的单服务器、多客户端

Netty 4-具有中央队列处理的单服务器、多客户端,netty,Netty,我的情况如下:一个“服务器”有一个队列,将来自其他地方的消息(建模为传输字符串)放在该队列上。此队列将由连接到服务器的所有和任何客户端使用。每个客户机都可以看作是一种工作流/BPM引擎,即接收的字符串被转换为POJO,然后进行评估,以查看它是否符合标准,以及是否符合标准,并进行进一步处理 我正在尝试使用服务器-客户机方法,通过这种方法,客户机将服务器(承载队列)连接到服务器(后退以使用)。我为每个服务器和客户端设置了一个基本管道工厂: 公共类ServerPipelineFactory扩展了通道初

我的情况如下:一个“服务器”有一个队列,将来自其他地方的消息(建模为传输字符串)放在该队列上。此队列将由连接到服务器的所有和任何客户端使用。每个客户机都可以看作是一种工作流/BPM引擎,即接收的字符串被转换为POJO,然后进行评估,以查看它是否符合标准,以及是否符合标准,并进行进一步处理

我正在尝试使用服务器-客户机方法,通过这种方法,客户机将服务器(承载队列)连接到服务器(后退以使用)。我为每个服务器和客户端设置了一个基本管道工厂:

公共类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编写循环