Magician 1.1.6 发布,采用事件组管理机制
Magician 1.1.6,作为第一个正式的版本,内部对NIO的实现部分做了大量优化与重构,采用了事件组管理机制,具体模型如下图所示:
采用了两个事件组来进行事件和线程池的管理,一个叫ioEventGroup,一个叫workerEventGroup,都是通过EventGroup类创建。 每个EventGroup 都对应一个EventRunner,每个EventRunner对应一个任务队列,可以管理多个事件。 当队列空了以后,可以去其他的EventRunner窃取任务,不会造成资源浪费。
ioEventGroup是用来管理Selector的,一个端口对应一个EventRunner里的一个事件,也就是说如果要监听多个端口就需要在ioEventGroup初始化多个EventRunner,这么做是因为EventRunner是按顺序消费事件的,如果多个监听事件都给一个EventRunner管理,可能会执行不到后面的事件,因为Selector是一个死循环 他会一直占用当前线程。
workerEventGroup是用来管理 业务事件的,一个连接对应一个EventRunner,一个EventRunner对应多个连接,当连接里有了read事件就会往EventRunner里添加一个事件,EventRunner会按顺序消费这些事件,在消费时 如果发现协议报文不完整会立刻停止该事件 继续执行下一个,如果报文完整会调用handler执行业务逻辑。 建议按照CPU的核心数来合理的设置workerEventGroup里的EventRunner数量。
具体如何使用
一、创建TCP服务(默认使用http解码器)
创建Handler
public class DemoHandler implements MagicianHandler<MagicianRequest> { @Override public void request(MagicianRequest magicianRequest) { // 响应数据 magicianRequest.getResponse() .sendJson(200, "{'status':'ok'}"); } }
创建服务(默认线程池配置)
Magician.createTCPServer() .httpHandler("/", new DemoHandler()) .bind(8080);
创建服务(自定义线程池配置)
EventGroup ioEventGroup = new EventGroup(1, Executors.newCachedThreadPool()); EventGroup workerEventGroup = new EventGroup(10, Executors.newCachedThreadPool()); // 当前EventRunner没任务的时候,允许从其他EventRunner窃取任务 workerEventGroup.setSteal(EventEnum.STEAL.YES); Magician.createTCPServer(ioEventGroup, workerEventGroup) .httpHandler("/", new DemoHandler()) .bind(8080);
创建服务(监听多端口)
// 监听几个端口,ioEventGroup的第一个参数就写几 EventGroup ioEventGroup = new EventGroup(2, Executors.newCachedThreadPool()); EventGroup workerEventGroup = new EventGroup(10, Executors.newCachedThreadPool()); // 当前EventRunner没任务的时候,允许从其他EventRunner窃取任务 workerEventGroup.setSteal(EventEnum.STEAL.YES); TCPServer tcpServer = Magician .createTCPServer(ioEventGroup, workerEventGroup) .httpHandler("/", new DemoHandler()) tcpServer.bind(8080); tcpServer.bind(8088);
二、创建WebSocket
只需要在创建http服务的时候加一个handler即可
Magician.createTCPServer() .httpHandler("/", new DemoHandler()) .webSocketHandler("/websocket", new DemoSocketHandler()) .bind(8080);
三、创建UDP服务
Magician.createTCPServer() .httpHandler("/", new DemoHandler()) .webSocketHandler("/websocket", new DemoSocketHandler()) .bind(8080);
除了这种写法,也可以单独创建handler,在这里add进去

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
“软件开源生态高校行”启动仪式顺利举办
党中央、国务院高度重视开源软件发展,国家软件发展战略将培育开源生态作为重点任务,国民经济和社会发展“十四五”规划和2035年远景目标纲要也明确提出支持开源社区等创新联合体发展。为贯彻落实国家软件发展战略,加速培育壮大我国开源生态,2021年4月25日“软件开源生态高校行”启动仪式在福州市海峡国际会展中心401会议室正式举办。 “软件开源生态高校行”是在国家工业和信息化部指导下开展的,由政府机构、软件开源生态共建机构和高等教育机构等社会各界力量共同发起和支持,是以加强大学生在软件开源领域学习和实践、推动高校“开源进教育”、构建我国适应未来科技发展要求的人才体系为使命的重大系列活动。这样大规模的“开源进教育”活动,属国内首次、行业首例,在世界范围也显独创,为推广开源文化、推行高校以“开源”为核心内容的教育工作创造了良好契机。 “软件开源生态高校行”的目的是让“开源”走进校园,即在社会层面鼓励学生参与软件开源生态建设,学习开源软件社区治理,提升产业和教育的融合与协同,实现个人与社会的共同进步。其中,作为社会个体由校园通往社会的蜕变通道、软件开发与贡献的智力高地,高等教育是“开源进教育”的重中...
- 下一篇
ORM 框架 Bee V1.9.0-5.1 发布,支持 Spring-boot,无 Javabean 插入
Bee V1.9.0-5.1(劳动节版) 新增功能: SuidRich新增方法:public boolean exist(T entity); //判断记录是否存在 MapSuid,无需Javabean操作数据库在查询、删除功能基础上,再增加插入功能。 调整bee.properties,HoneyConfig配置信息. 整合Spring boot,提供bee-spring-boot-starter. 支持利用Javabean生成表. 修复缺陷:jdk 11下,LoggerFactory在配置log4j2时,报错. Bee是一个Java ORM框架。重点是简单,同时功能还很强大! 一个兼具Hibernate和Mybatis优点的ORM框架,同时又避免了两者的缺陷; 此外还有许多自己的优点,如开发速度快,编写代码少,文件小,具有分布式特性。 Bee 是一个简单,易用,功能强大,开发速度快,编码少的 JAVA ORM 框架。 如果说Mybatis在Hibernate之后不是重复造轮子,那Bee在Hibernate和Mybatis之后也不会是重复造轮子! 工欲善其事必先利其器!——《论语·卫灵...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19