异步模型
基本介绍:
- 异步的概念与同步相对。当一个异步过程调用发出后,调用者不会立刻得到结果,实际处理这个调用的组件在完成后,通过状态、通知和回调来通知调用者;
- Netty中的 I/O 操作是异步的,包括 Bind 、 Write 、Connect 的等操作会简单的返回一个ChannelFuture。
- 当调用者并不能立刻得到记过,而是通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得I/O操作结果。
- Netty的异步操作模型是在future和callback之上。callback就是回调,重点是Future。其核心思想时候:假设一个方法run,计算过程可能非常耗时,同步等待其结果显示不合适。呢么可以在调用fun的时候,立马返回一个Future,后续可以通过Future去监控fun的处理过程(既: Future-Listener机制)
下述代码以指数退让的方式进行连接,connect后返回了相应的Future对象;
/**
* 以指数退避的方式进行失败重试
*
* @param bootstrap netty-client 引导类
* @param host host
* @param port port
* @param retryTimes 重试次数
*/
private static void connect(Bootstrap bootstrap, String host, int port, int retryTimes) {
ChannelFuture channelFuture = bootstrap.connect(host, port).addListener(future -> {
if (future.isSuccess()) {
System.out.println("连接成功");
} else if (retryTimes == 0) {
System.out.println("尝试至最大次数,但仍然失败¬");
} else {
int order = (MAX_RETRY_TIME - retryTimes) + 1;
int delay = 1 << order;
System.err.println(new Date() + ": 连接失败,第" + order + "次重连……");
Runnable runnable = () -> connect(bootstrap, host, port, retryTimes - 1);
bootstrap.config()
.group()
//Runnable var1, long var2, TimeUnit var4
.schedule(runnable, delay, TimeUnit.SECONDS);//延时多久后进行一次执行
}
});
}
ChannelFuture:
The result of an asynchronous {@link Channel} I/O operation.
- 表示异步执行结果,通过其提供的API检查执行是否完成
- 本质是继承了Future,并且定义了更多方法。如可以添加监听器
- 工作原理(下图pipeline):
1) 在使用Netty进行编程时,拦截操作和转换出入栈数据只需要根据callback或者利用future即可。使得链式操作简单、高效。
2)从网络基础编码中脱离。
- 当Future对象刚刚创建时,处于非玩成状态,掉用者可以通过返回的ChannelFuture来获取操作执行的状态,注册监听函数玩成执行后的操作;
- 常见的API:isDone、isSuccess、getCause、addListener