博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Netty (1)
阅读量:5973 次
发布时间:2019-06-19

本文共 1768 字,大约阅读时间需要 5 分钟。

Netty是由JBOSS提供的一个java开源框架,本质上也是NIO,是对NIO的封装,比NIO更加高级,功能更加强大。可以说发展的路线是IO->NIO->Netty。

ServerBootstrap和ClientBootstrap是Netty中两个比较重要的类,分别用来进行服务器和客户端的初始化。

服务器:

// ChannelFactory        final ChannelFactory channelFactory = new NioServerSocketChannelFactory(                  // Boss线程池,处理Socket请求                Executors.newCachedThreadPool(),                  // Worker线程池,由于使用的是NIO,1个Worker线程可以管理多个Channel                Executors.newCachedThreadPool());         // ServerBootstrap        ServerBootstrap bootstrap = new ServerBootstrap(channelFactory);            ServerPipelineFactory serverPipelineFactory = new ServerPipelineFactory(executionHandler);        bootstrap.setPipelineFactory(serverPipelineFactory);

ServerBootstrap实例化时需要一个ServerSocketChannelFactory参数,ServerSocketChannelFactory可以选择NioServerSocketChannelFactory或者OioServerSocketChannelFactory,NioServerSocketChannelFactory使用的是NIO,OioServerSocketChannelFactory使用的是普通IO。两者都需要两个线程池,一个Boss线程池,一个Worker线程池。一个Boss线程负责对一个端口的监听,接收到Socket连接请求以后交给一个Worker线程处理,然后自己继续监听。

Worker线程负责对接收到的连接请求进行处理,如果是NIO,一个Worker线程可以处理多个Socket或者说Channel,如果是普通IO,Worker线程和Socket或者说Channel是一一对应的关系。

Channel有消息到达时,Worker线程就进行处理。处理的过程类似于Struts的Filter-chain。每个Channel都有一个ChannelPipeline,ChannelPipeline定义了很多有顺序的Handler,按顺序对接收到的消息进行处理。

有些Handler,比如大量的IO操作,或者大量的读写数据库,会造成对消息的处理时间过长,长期占用Worker线程,这时就需要另一个线程池--Netty自带的ExecutionHandler。ExecutionHandler也是一个Handler,定义在ChannelPipeline里面,它会从自己的线程池里面拿出一个线程,处理写在自己后面的Handler,从而可以尽快释放Worker线程。

ExecutionHandler的实例化:

static ExecutionHandler executionHandler = new ExecutionHandler(new OrderedMemoryAwareThreadPoolExecutor(16, 1048576, 1048576));

Excecutor有两种:MemoryAwareThreadPoolExecutor和OrderedMemoryAwareThreadPoolExecutor,前者保证不会出现内存溢出错误,如果Event太多就会堵塞,后者除了保证不会出现内存溢出错误以外,还保证同一个Channel的Event按照顺序处理。

转载地址:http://mabox.baihongyu.com/

你可能感兴趣的文章
Shell之Sed常用用法
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
mysql开启binlog
查看>>
设置Eclipse编码方式
查看>>
分布式系统唯一ID生成方案汇总【转】
查看>>
并查集hdu1232
查看>>
Mysql 监视工具
查看>>
Linux Namespace系列(09):利用Namespace创建一个简单可用的容器
查看>>
博客搬家了
查看>>
Python中使用ElementTree解析xml
查看>>
linux的日志服务器关于屏蔽一些关键字的方法
查看>>
mysql多实例实例化数据库
查看>>
javascript 操作DOM元素样式
查看>>
HBase 笔记3
查看>>
【Linux】Linux 在线安装yum
查看>>
Atom 编辑器系列视频课程
查看>>
[原][osgearth]osgearthviewer读取earth文件,代码解析(earth文件读取的一帧)
查看>>
mybatis update返回值的意义
查看>>
expdp 详解及实例
查看>>
通过IP判断登录地址
查看>>