一、TaskQueue 任务队列
Netty主要基于主从Reactor多线程模型(如图)做了一定的改进,其中主从Reactor多线程模型有多个Reactor

1.1 为什么需要TaskQueue?

在PipeLine中会进行业务处理,当处理比较复杂的业务时需要大量的时间,这时候就会造成长时间的阻塞,所以需要将这些复杂的业务加入到taskQueue中进行异步处理,而不会影响到其他任务的正常进行,即不会造成长时间的阻塞
1.2 任务队列中的Task有三种典型使用场景
- 用户程序自定义的普通任务
- 用户自定义定时任务
- 非当前Reactor线程调用Channel的各种方法
例如: 在推送系统的业务流程里面,根据用户的标识,找到对应的Channel引用,然后调用Write类方法向该用户推送消息,就会进入到这种场景。最终的Write会提交到任务队列中后被异步消费
1.3 常规阻塞式实例代码演示
1.3.1 服务端NettyServer代码实现
package com.netty.taskQueue;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import java.net.ServerSocket;
public class NettyServer {
public static void main(String[] args) throws InterruptedException {
//创建线程池对象
NioEventLoopGroup bossGroup = new NioEventLoopGroup();
NioEventLoopGroup workGroup = new NioEventLoopGroup();
//创建配置启动类
ServerBootstrap serverBootstrap = new ServerBootstrap();
try {
//添加相关配置
serverBootstrap.group(bossGroup, workGroup)//添加线程池组
.channel(NioServerSocketChannel.class)//
.option(ChannelOption.SO_BACKLOG, 128)//
.childOption(ChannelOption.SO_KEEPALIVE, true)//
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel c

本文介绍了Netty中TaskQueue的使用场景及其实现方式,包括解决长时间阻塞问题的方法,自定义定时任务,以及非当前Reactor线程调用Channel的各种方法。
最低0.47元/天 解锁文章
443

被折叠的 条评论
为什么被折叠?



