Netty ChannelGroupFutureListener操作从未调用

Netty ChannelGroupFutureListener操作从未调用,netty,Netty,基于Netty文档,我对服务器有以下定义: public void start()引发异常{ incommingGroup=new NioEventLoopGroup(); workerGroup=new NioEventLoopGroup(); final ServerBootstrap ServerBootstrap=new ServerBootstrap(); serverBootstrap.group(incommingGroup,workerGroup).channel(NioServ

基于Netty文档,我对服务器有以下定义:

public void start()引发异常{
incommingGroup=new NioEventLoopGroup();
workerGroup=new NioEventLoopGroup();
final ServerBootstrap ServerBootstrap=new ServerBootstrap();
serverBootstrap.group(incommingGroup,workerGroup).channel(NioServerSocketChannel.class)
.childHandler(新的通道初始值设定项(){
@凌驾
受保护的无效初始化通道(最终通道)引发异常{
最终ChannelPipeline=channel.pipeline();
addLast(“logger”,newlogginghandler());
pipeline.addLast(“帧解码器”,
新的DelimiterBasedFrameDecoder(1024,unmooled.wrappedBuffer(新字节[]{'\r','\n'}),
unmooled.wrappedBuffer(新字节[]{'\n'}),
wrappedBuffer(新字节[]{';'}));
addLast(“stringDecoder”,新的stringDecoder());
addLast(“stringEncoder”,新的stringEncoder());
addLast(新的TrackerChannel OutboundHandler());
addLast(新的TrackerChannelInboundHandler(/*eventAdmin*/notificationService));
channelGroup.add(频道);
}
}).option(ChannelOption.SO_KEEPALIVE,Boolean.TRUE)
.option(ChannelOption.ALLOCATOR,PooledByteBufAllocator.DEFAULT)
.childOption(ChannelOption.ALLOCATOR,PooledByteBufAllocator.DEFAULT);
final ChannelFuture cf=serverBootstrap.bind(notificationService.port());
最终通道=参考通道();
channelGroup=新的DefaultChannelGroup(“GroupGPStracker”,GlobalEventExecutor.INSTANCE);
channelGroup.add(频道);
}
我想像这样给所有客户端写一些消息(同一服务器类的方法):

public void write(TrackerMessage TrackerMessage){
ChannelGroupFuture result=channelGroup.writeAndFlush(trackerMessage,ChannelMatchers.isNonServerChannel());
result.addListener(新的ChannelGroupFutureListener(){
@凌驾
public void operation complete(ChannelGroupFuture arg0)引发异常{
LOGGER.info(“某些信息”);
}
});
}
trackerChannel OutboundHandler的实现是:

公共类TrackerChannelOutboundHandler扩展了ChannelOutboundHandlerAdapter{
@凌驾
公共无效写入(ChannelHandlerContext ctx、对象消息、ChannelPromise承诺){
如果(ctx!=null&&ctx.channel()!=null&&ctx.channel().isWritable())
ctx.writeAndFlush(trackerMessage.getMessage()+“\n”);
}
}

在客户端成功接收消息,但为什么从未调用
ChannelGroupFutureListener
operationComplete
方法


我使用的是Netty版本:4.0.40。

在扩展
ChannelOutboundHandlerAdapter
时,确保与通道的所有本机交互都正确传播是很重要的。这应该通过遵守
ChannelFuture
s和
ChannelPromise
s来实现

目前,您正在忽略上游
渠道承诺
,阻止任何上游成功通知的发送,因此您的未来永远不会被标记为成功

您应该使用超类实现或
ctx.write(Object,ChannelPromise)
方法将消息正确地传递到上游,如果出现错误,您应该根据您的意图手动将未来标记为失败或成功

@覆盖
公共无效写入(ChannelHandlerContext ctx、对象消息、ChannelPromise承诺){
如果(ctx!=null&&ctx.channel()!=null&&ctx.channel().isWritable())
super.write(ctx,trackerMessage.getMessage()+“\n”,promise);
其他的
setFailure(新java.util.concurrent.CancellationException());
}

扩展
通道OutboundHandlerAdapter
时,确保与通道的所有本机交互都正确传播是很重要的。这应该通过遵守
ChannelFuture
s和
ChannelPromise
s来实现

目前,您正在忽略上游
渠道承诺
,阻止任何上游成功通知的发送,因此您的未来永远不会被标记为成功

您应该使用超类实现或
ctx.write(Object,ChannelPromise)
方法将消息正确地传递到上游,如果出现错误,您应该根据您的意图手动将未来标记为失败或成功

@覆盖
公共无效写入(ChannelHandlerContext ctx、对象消息、ChannelPromise承诺){
如果(ctx!=null&&ctx.channel()!=null&&ctx.channel().isWritable())
super.write(ctx,trackerMessage.getMessage()+“\n”,promise);
其他的
setFailure(新java.util.concurrent.CancellationException());
}

这正是我们所缺少的!谢谢这正是我们所缺少的!谢谢