我有一段代码检查ChannelHandlerContext WriteandFlush是否成功(确保在发送下一条消息之前已成功发送消息)
logger.debug("Writing '" + message + "' to channel now");
ctx.writeAndFlush(message.getMessage());
ChannelFutureListener cfl = new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture future) throws Exception {
if (future.isSuccess()) {
// Message was successfully sent
logger.debug("Message '" + message + "' sent successfully");
我遇到的问题是在writeandflush之后,operationComplete只需要一秒钟,这就是我的服务器性能上升。 有谁知道为什么这么长时间?
在继续之前以这种方式检查writeandflush的成功是否是最佳做法?
答案 0 :(得分:1)
在异步框架中处理消息的最佳方法就是发送消息。 Netty会处理这些消息,并按正确的顺序到达。
调用ChannelFutureListener之前需要这么长时间的原因是因为Netty只会在write + flush完全成功时调用它。发生这种情况时,会发生以下情况:
writeAndFlush
这种方法的优点在于,您知道对方在调用侦听器时已完全接收到数据,并且可以安全地调用此时关闭的方法。
如果要将多个数据包发送到同一个连接,而不是调用重复的writeAndFlush
,则应该为每个数据包调用write
,然后在发送flush()
之后发送{{1}}最后一个数据包,这样所有的pckets都会被同时处理。