本文整理汇总了Java中io.netty.channel.ChannelFuture.syncUninterruptibly方法的典型用法代码示例。如果您正苦于以下问题:Java ChannelFuture.syncUninterruptibly方法的具体用法?Java ChannelFuture.syncUninterruptibly怎么用?Java ChannelFuture.syncUninterruptibly使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类io.netty.channel.ChannelFuture
的用法示例。
在下文中一共展示了ChannelFuture.syncUninterruptibly方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Java代码示例。
示例1: call
import io.netty.channel.ChannelFuture; //导入方法依赖的package包/类
@Override
public RpcResponse call() throws Exception {
//初始化返回结果容器,将本次调用的唯一标识作为Key存入返回结果的Map
RevokerResponseHolder.initResponseData(request.getUniqueKey());
//根据本地调用服务提供者地址获取对应的Netty通道channel队列
ArrayBlockingQueue<Channel> blockingQueue = NettyChannelPoolFactory.channelPoolFactoryInstance().acquire(inetSocketAddress);
try {
if (channel == null) {
//从队列中获取本次调用的Netty通道channel
channel = blockingQueue.poll(request.getInvokeTimeout(), TimeUnit.MILLISECONDS);
}
//若获取的channel通道已经不可用,则重新获取一个
while (!channel.isOpen() || !channel.isActive() || !channel.isWritable()) {
logger.warn("----------retry get new Channel------------");
channel = blockingQueue.poll(request.getInvokeTimeout(), TimeUnit.MILLISECONDS);
if (channel == null) {
//若队列中没有可用的Channel,则重新注册一个Channel
channel = NettyChannelPoolFactory.channelPoolFactoryInstance().registerChannel(inetSocketAddress);
}
}
//将本次调用的信息写入Netty通道,发起异步调用
ChannelFuture channelFuture = channel.writeAndFlush(request);
channelFuture.syncUninterruptibly();
//从返回结果容器中获取返回结果,同时设置等待超时时间为invokeTimeout
long invokeTimeout = request.getInvokeTimeout();
return RevokerResponseHolder.getValue(request.getUniqueKey(), invokeTimeout);
} catch (Exception e) {
logger.error("service invoke error.", e);
} finally {
//本次调用完毕后,将Netty的通道channel重新释放到队列中,以便下次调用复用
NettyChannelPoolFactory.channelPoolFactoryInstance().release(blockingQueue, channel, inetSocketAddress);
}
return null;
}