Java Netty:未使用DefaultFileRegion调用ChannelProgressiveFutureListener

Java Netty:未使用DefaultFileRegion调用ChannelProgressiveFutureListener,java,listener,netty,Java,Listener,Netty,我正在使用一个文件区域从我的基于netty的服务器下行。当客户端接收数据时,我添加到channel future的ChannelProgressiveFutureListener永远不会被调用。我对netty的编程不是很有经验,所以我想我误解了netty未来的工作方式。因此,我查看了在此处找到的示例代码:。但基本上是相同的代码?我试图在这里找到类似的问题,但找不到原因。提前感谢您的任何提示,为什么听众从未接到电话 long todo=file.length()-mRequest.pCursor;

我正在使用一个文件区域从我的基于netty的服务器下行。当客户端接收数据时,我添加到channel future的ChannelProgressiveFutureListener永远不会被调用。我对netty的编程不是很有经验,所以我想我误解了netty未来的工作方式。因此,我查看了在此处找到的示例代码:。但基本上是相同的代码?我试图在这里找到类似的问题,但找不到原因。提前感谢您的任何提示,为什么听众从未接到电话

long todo=file.length()-mRequest.pCursor;
ctx.writeAndFlush(mFileCursorPacket.encodeInformation(新文件游标(mRequest.pToken,todo));
mFileregion=新的DefaultFileRegion(文件,mRequest.pCursor,todo);
ChannelFuture-future=ctx.writeAndFlush(mFileregion,ctx.newProgressivePromise());
//从未被召唤的听众!
future.addListener(新通道ProgressiveFutureListener(){
@凌驾
public void operation progressioned(ChannelProgressiveFuture、long Progression、long total)引发异常{
O.debug(mSession.getId()+”:下载的“+progress+”字节=“+String.valueOf”((float)progress/(float)total));
}
@凌驾
public void operation complete(ChannelProgressiveFuture)引发异常{
布尔成功=future.issucess();
O.info(mSession.getId()+”:下载成功:“+success”;
如果(mFileregion!=null)mFileregion.release();
mFileregion=null;
}
});
我的管道如下所示:

ServerBootstrap b=newserverbootstrap();//
b、 组(mBossGroup,mWorkerGroup).channel(NioServerSocketChannel.class)//
//.channel(ServerSocketChannel.class)
.childHandler(新的ChannelInitializer(){//
@凌驾
public void initChannel(SocketChannel ch)引发异常{
ProtocolMessageInboundHandler inboundHandler=新ProtocolMessageInboundHandler();
inboundHandler.setMessageSizeLimit(最大数据包长度);
ch.pipeline().addLast(ReadTimeoutHandler.class.getName(),新的ReadTimeoutHandler(SO_TIMEOUT_STD));
ch.pipeline().addLast(名称\协议\消息\入站,inboundHandler);
ch.pipeline().addLast(名称\协议\消息\出站,新协议MessageOutboundHandler());
//传递给LoginHandler的上下文是ServerContext,与netty无关
ch.pipeline().addLast(LoginHandler.class.getName(),新的LoginHandler(context));
ch.pipeline().addLast(TimeoutHandler.class.getName(),new TimeoutHandler());
}
}).option(ChannelOption.SO_BACKLOG,128).childOption(ChannelOption.SO_KEEPALIVE,true);//
//绑定并开始接受传入连接。
b、 绑定(PORT.sync();

而文件发送处理程序插入到ProtocolMessageInboundHandler之后(它只修改byte[]对象并传递bytebuf对象)。因此,在文件发送处理程序和?netty?

之间没有其他处理程序。如果要发送
FileRegion
,您的管道中应该有一个可以发送此类对象的处理程序。为此,Netty中最常用的类是。这也用于for
DefaultFileRegion

将以下代码添加到初始值设定项以使其支持
FileRegion
s:

ch.pipeline ().addLast(new ChunkedWriteHandler());

如果要发送
文件区域
,则管道中应该有一个可以发送此类对象的处理程序。为此,Netty中最常用的类是。这也用于for
DefaultFileRegion

将以下代码添加到初始值设定项以使其支持
FileRegion
s:

ch.pipeline ().addLast(new ChunkedWriteHandler());

你们的管道看起来怎么样?我在原来的帖子中添加了引导。发送文件的处理程序“原则上”是作为管道中的第一个处理程序插入的。我甚至无法获得“OperationComplete”事件,这使得使用此方法非常困难(因为我想在从服务器下载时禁用套接字超时)。如果您能找出原因,我将非常感谢您的帮助(即使它不能与Proges侦听器一起使用),您的管道看起来如何?我在原始帖子中添加了引导。发送文件的处理程序“原则上”是作为管道中的第一个处理程序插入的。我甚至无法获得“OperationComplete”事件,这使得使用此方法非常困难(因为我想在从服务器下载时禁用套接字超时)。如果您能找出原因,我将非常感谢您提供的任何帮助(即使它对Proges侦听器不起作用)。谢谢您的回答!我添加了处理程序,但无论是使用FileRegion方法还是使用新的ChunkedFile编写:侦听器都不会得到通知!两个版本都提供了文件,但我无法确定(在服务器端)传输何时完成。FileRegion的问题是,因为零拷贝没有向管道中注入任何新的字节buf。明天我将尝试使用ChunkedFile发送文件,并计算另一个处理程序中写入的字节数(以通知承诺)。希望这有助于回答问题!我添加了处理程序,但无论是使用FileRegion方法还是使用新的ChunkedFile编写:侦听器都不会得到通知!两个版本都提供了文件,但我无法确定(在服务器端)传输何时完成。FileRegion的问题是,因为零拷贝没有向管道中注入任何新的字节buf。明天我将尝试使用ChunkedFile发送文件,并计算另一个处理程序中写入的字节数(到