5
回答
有关netty释放资源的问题
华为云实践训练营,热门技术免费实践!>>>   

本人在学习netty中,遇到了一些问题,想请教一下:

1、netty的客户端,可以在连接空闲一段时间后自动释放掉吗?如果能的话,怎么设置自动释放的时间?

2、现在有,比如:5个线程,一个线程发送100条数据,都是用的同一个Channel,比如有个片段代码:

 /** 释放连接方法*/
public void closeConnect(ChannelFuture writeFuture){
	if(writeFuture != null){
		writeFuture.awaitUninterruptibly();
	}
        //client 为 ClientBootstrap对象
        //这里的future = client.connect()获取的
        future.getChannel().close();
	future.getChannel().getCloseFuture().awaitUninterruptibly();
	client.releaseExternalResources();
	}

ChannelFuture future = Channels.write(data);//写数据
closeConnect(future);//调用释放连接方法

现在在多条线程发送多条数据下工作,会报closeChannelsException,那关闭连接的方法该怎么改进呢?谢谢各位

举报
yerendian
发帖于5年前 5回/2K+阅
共有5个答案 最后回答: 5年前
ChannelFutureListener remover = new ChannelFutureListener() {
        public void operationComplete(ChannelFuture future) throws Exception {
            ...//处理释放
        }
    };
future.addListener(remover);

--- 共有 1 条评论 ---
yerendian这样不行哦,我用的是同一个channel,现在多条线程跑,每次write完都返回一个future,监听future,然后释放channel,那数据就写不完了,必须要等到所有的数据发送完,才能关 5年前 回复

不太明白你整个业务是怎样的

问题一:可以的,有个WriteTimeOut类的,你找找,和ReadTimeOUt一样的道理,加上去就可以了

问题二:你这么多线程对应一个channel应用同步锁吧,如果出现closeChannelsException又不是自己主动调的,一般是客户端主动调用close方法

引用来自“JavaGG”的答案

不太明白你整个业务是怎样的

问题一:可以的,有个WriteTimeOut类的,你找找,和ReadTimeOUt一样的道理,加上去就可以了

问题二:你这么多线程对应一个channel应用同步锁吧,如果出现closeChannelsException又不是自己主动调的,一般是客户端主动调用close方法

业务很简单, 就是从指定的服务器发到另一台,多个线程发送数据,共用一个连接,生成连接的方法(connect())用了同步锁,每次写数据都会进connect()判断一次,保证同一个连接。WriteTimeout和ReadTimeout一样的用吗?我之前有用过,没有效果啊。出现closeChannelException是我调了关闭方法出现的,因为是一个连接,每次写数据都会返回future,我监听future,然后关闭连接,就会出现上面的异常了,有什么办法能正常关闭连接吗?
顶部