一、使用场景了解
1、用户程序自定义普通任务
2、用户自定义定时任务
3、非当前Reactor 线程调用Channel 的各种用法
1)比如:推送任务系统的业务线程里面,根据用户的标识,找到对应的Channel 引用,然后调用Write 类方法向用户推送消息,就会进入到这种场景。最终的Write会提交到任务队列中后被异步消费。
二、第一种自定义普通任务
1、代码模拟阻塞 、是基于上一节笔记基础之上
客户端会阻塞10s才会得到响应
/**
* 读取数据(这里可以读取客户端发送的消息)
*
* @param ctx:上下文对象,含有管道pipeline,通道channel, 地址
* @param msg:客户端发送的数据,默认Object
* @throws Exception
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// 模拟阻塞
// 假如这有一个耗时长的业务 => 异步执行 => 提交channel 对应的
// NIOEventLoop 的TaskQueue中
Thread.sleep(10*1000);
ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端======oooo", CharsetUtil.UTF_8));
System.out.println("continue.....");
}
2、自定义任务
/**
* 读取数据(这里可以读取客户端发送的消息)
*
* @param ctx:上下文对象,含有管道pipeline,通道channel, 地址
* @param msg:客户端发送的数据,默认Object
* @throws Exception
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// 模拟阻塞
// 假如这有一个耗时长的业务 => 异步执行 => 提交channel 对应的
// NIOEventLoop 的TaskQueue中
// Thread.sleep(10*1000);
// ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端======oooo", CharsetUtil.UTF_8));
// System.out.println("continue.....");
// 解决方案一 用户程序自定义的普通任务
// ctx.channel().eventLoop().execute(new Runnable() {
// @Override
// public void run() {
// try {
// Thread.sleep(10 * 1000);
// } catch (Exception e) {
// System.out.println("发生异常" + e.getMessage());
// }
// ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端======oooo", CharsetUtil.UTF_8));
// }
// });
// 用lambda表达式替换 上面的代码
System.out.println("当前系统时间为=====" + System.currentTimeMillis());
ctx.channel().eventLoop().execute(() -> {
try {
Thread.sleep(10 * 1000);
} catch (Exception e) {
System.out.println("发生异常" + e.getMessage());
}
ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端======oooo1", CharsetUtil.UTF_8));
System.out.println("当前系统时间为=====" + System.currentTimeMillis());
});
System.out.println("continue.....");
ctx.channel().eventLoop().execute(() -> {
try {
Thread.sleep(20 * 1000);
} catch (Exception e) {
System.out.println("发生异常" + e.getMessage());
}
ctx.writeAndFlush(Unpooled.copiedBuffer("hello 客户端======oooo2", CharsetUtil.UTF_8));
System.out.println("当前系统时间为=====" + System.currentTimeMillis());
});
System.out.println("continue.....");
}
任务可以创建多个。这个任务是一个一个执行。第一个执行10s 第二个执行10+20秒
具体查看在 ctx => pipeline => eventLoop =>taskQueue