一、类介绍
1.ChannelPool——连接池接口

2.SimpleChannelPool——实现ChannelPool接口,简单的连接池实现

3.FixedChannelPool——继承SimpleChannelPool,有大小限制的连接池实现

4.ChannelPoolMap——管理host与连接池映射的接口

5.AbstractChannelPoolMap——抽象类,实现ChannelPoolMap接口

二、具体使用
a、MyNettyPool——Netty自带连接池的用法

  1. package com.dxfx.netty.demo;
  2.  
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.dxfx.netty.framework.Constants;
  5. import com.dxfx.netty.framework.DefaultFuture;
  6. import com.dxfx.netty.framework.NettyClientHandler;
  7. import com.dxfx.netty.param.RequestParam;
  8. import com.dxfx.netty.param.Response;
  9.  
  10. import io.netty.bootstrap.Bootstrap;
  11. import io.netty.channel.Channel;
  12. import io.netty.channel.nio.NioEventLoopGroup;
  13. import io.netty.channel.pool.AbstractChannelPoolMap;
  14. import io.netty.channel.pool.ChannelPoolHandler;
  15. import io.netty.channel.pool.ChannelPoolMap;
  16. import io.netty.channel.pool.FixedChannelPool;
  17. import io.netty.channel.socket.nio.NioSocketChannel;
  18. import io.netty.handler.codec.DelimiterBasedFrameDecoder;
  19. import io.netty.handler.codec.Delimiters;
  20. import io.netty.handler.codec.string.StringDecoder;
  21. import io.netty.handler.codec.string.StringEncoder;
  22. import io.netty.util.concurrent.Future;
  23. import io.netty.util.concurrent.FutureListener;
  24.  
  25. /**
  26. * Netty自带连接池的用法
  27. *
  28. * @author Administrator
  29. *
  30. */
  31. public class MyNettyPool {
  32. // key为目标host,value为目标host的连接池
  33. public static ChannelPoolMap<String, FixedChannelPool> poolMap;
  34. private static final Bootstrap bootstrap = new Bootstrap();
  35.  
  36. static {
  37. bootstrap.group(new NioEventLoopGroup());
  38. bootstrap.channel(NioSocketChannel.class);
  39. bootstrap.remoteAddress("localhost", 8080);
  40. }
  41.  
  42. public MyNettyPool() {
  43. init();
  44. }
  45.  
  46. /**
  47. * netty连接池使用
  48. *
  49. */
  50. public void init() {
  51. poolMap = new AbstractChannelPoolMap<String, FixedChannelPool>() {
  52.  
  53. @Override
  54. protected FixedChannelPool newPool(String key) {
  55. ChannelPoolHandler handler = new ChannelPoolHandler() {
  56. /**
  57. * 使用完channel需要释放才能放入连接池
  58. *
  59. */
  60. @Override
  61. public void channelReleased(Channel ch) throws Exception {
  62. // 刷新管道里的数据
  63. // ch.writeAndFlush(Unpooled.EMPTY_BUFFER); // flush掉所有写回的数据
  64. System.out.println("channelReleased......");
  65. }
  66.  
  67. /**
  68. * 当链接创建的时候添加channelhandler,只有当channel不足时会创建,但不会超过限制的最大channel数
  69. *
  70. */
  71. @Override
  72. public void channelCreated(Channel ch) throws Exception {
  73. ch.pipeline().addLast(new StringEncoder());
  74. ch.pipeline().addLast(new DelimiterBasedFrameDecoder(Integer.MAX_VALUE, Delimiters.lineDelimiter()[0]));
  75. ch.pipeline().addLast(new StringDecoder());
  76. // 绑定channel的handler
  77. ch.pipeline().addLast(new NettyClientHandler());
  78. }
  79.  
  80. /**
  81. * 获取连接池中的channel
  82. *
  83. */
  84. @Override
  85. public void channelAcquired(Channel ch) throws Exception {
  86. System.out.println("channelAcquired......");
  87. }
  88. };
  89.  
  90. return new FixedChannelPool(bootstrap, handler, 50); //单个host连接池大小
  91. }
  92. };
  93.  
  94. }
  95.  
  96. /**
  97. * 发送请求
  98. *
  99. * @param msg
  100. * 请求参数
  101. * @param command
  102. * 请求方法
  103. * @return
  104. */
  105. public Response send(final Object msg, final String command) {
  106. //封装请求数据
  107. final RequestParam request = new RequestParam();
  108. request.setCommand(command);
  109. request.setContent(msg);
  110.  
  111. //从连接池中获取连接
  112. final FixedChannelPool pool = poolMap.get("localhost");
  113. //申请连接,没有申请到或者网络断开,返回null
  114. Future<Channel> future = pool.acquire();
  115. future.addListener(new FutureListener<Channel>() {
  116. @Override
  117. public void operationComplete(Future<Channel> future) throws Exception {
  118. //给服务端发送数据
  119. Channel channel = future.getNow();
  120. channel.write(JSONObject.toJSONString(request));
  121. channel.writeAndFlush(Constants.DELIMITER);
  122.  
  123. System.out.println(channel.id());
  124. // 连接放回连接池,这里一定记得放回去
  125. pool.release(channel);
  126. }
  127. });
  128.  
  129. //获取服务端返回的数据
  130. DefaultFuture defaultFuture = new DefaultFuture(request);
  131. return defaultFuture.get();
  132.  
  133. }
  134.  
  135. }

b、MyNettyPoolTest——Netty自带连接池测试类,SpringServer为连接池启动类

  1. package com.dxfx.netty.demo;
  2.  
  3. import com.dxfx.netty.param.Response;
  4. import com.dxfx.user.model.User;
  5.  
  6. /**
  7. * Netty自带连接池测试类,SpringServer为连接池启动类
  8. *
  9. * @author Administrator
  10. *
  11. */
  12. public class MyNettyPoolTest {
  13.  
  14. public static void main(String[] args) {
  15. User user = new User();
  16. user.setAge(12);
  17. user.setId(23);
  18. user.setName("client");
  19. String command = "login";
  20.  
  21. MyNettyPool pool = new MyNettyPool();
  22. new MyThread(pool, user, command).start();
  23. new MyThread(pool, user, command).start();
  24. new MyThread(pool, user, command).start();
  25. new MyThread(pool, user, command).start();
  26. for (int i = 0; i < 50000; i++) {
  27. new MyThread(pool, user, command).start();
  28. }
  29. }
  30.  
  31. }
  32.  
  33. class MyThread extends Thread {
  34.  
  35. public MyNettyPool pool;
  36. public Object msg;
  37. public String command;
  38.  
  39. public MyThread(MyNettyPool pool, Object msg, String command) {
  40. super();
  41. this.pool = pool;
  42. this.msg = msg;
  43. this.command = command;
  44. }
  45.  
  46. @Override
  47. public void run() {
  48. Response response = pool.send(msg, command);
  49. //System.out.println(response);
  50. }
  51.  
  52. }

Netty自带连接池的使用的更多相关文章

  1. 带连接池的netty客户端核心功能实现剖解

    带连接池的netty客户端核心功能实现剖析 带连接池的netty的客户端核心功能实现剖析 本文为原创,转载请注明出处 源码地址: https://github.com/zhangxianwu/ligh ...

  2. springboot使用自带连接池连接postgre

    Application配置spring.datasource.url=jdbc:postgresql://***:5432/postgresspring.datasource.username=pos ...

  3. Hibernate查询、连接池、二级缓存

    Hibernate第三天: 1. 对象状态 2. session缓存 3. lazy懒加载 4. 映射 一对一对映射 组件/继承映射 目标: 一.hibernate查询 二.hibernate对连接池 ...

  4. Hibernate的查询,二级缓存,连接池

    Hibernate的查询,二级缓存,连接池 1.Hibernate查询数据 Hibernate中的查询方法有5中: 1.1.Get/Load主键查询 使用get或者load方法来查询,两者之间的区别在 ...

  5. Hibernate【查询、连接池、逆向工程】

    前言 在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式....到目前为止,我们都是使用一些简单的主键查询阿...使用HQL查询所有的数据....本博文主要讲解Hiberna ...

  6. OpenResty 高阶实战之————Redis授权登录使用短连接(5000)和长连接(500W) 使用连接池AB压力测试结果

    一.短连接开始测试 ab -n 5000 -c 100 -k 127.0.0.1/test_redis_short #demo1 Concurrency Level: Time taken for t ...

  7. php连接池 php–cp

    原文地址:http://blog.sina.com.cn/s/blog_9eaa0f400102v9fd.html 数据库连接池php-cp介绍时间 2015-01-23 11:53:05 数据库连接 ...

  8. 非常老的话题 SQLSERVER连接池

    原文:非常老的话题 SQLSERVER连接池 非常老的话题 SQLSERVER连接池 写这篇文章不是说要炒冷饭,因为园子里有非常非常多关于SQLSERVER连接池的文章,但是他们说的都是引用MSDN里 ...

  9. 带有连接池的Http客户端工具类HttpClientUtil

    一.背景 业务开发中,经常会遇到通过http/https向下游服务发送请求.每次都要重复造轮子写HttpClient的逻辑,而且性能.功能参差不齐.这里分享一个高性能的.带连接池的通用Http客户端工 ...

随机推荐

  1. vector容器用法详解

    vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组.像数组一样,vector类也用从0开始的下标表示元素的位置:但和数组不同的是,当vector对象创建后,数组的元素个数会随着ve ...

  2. windows平台下的oracle ORA-01031的解决方法

    今天下午遇到一个很怪异的问题,在windows平台下sqlplus  / as sysdba登陆数据库,提示权限不足, 当时就纳闷了,sys用户登陆数据库还能权限不足,问题出现了,就开始寻找解决方法呗 ...

  3. jenkins可选插件为空的解决方式

    我是安装的jenkins,文件名字是这个jenkins.msi,点finish安装完成,然后浏览器就自动打开了jenkins页面,输入密码后,便进入了如下页面 之后我是选择的跳过插件安装,在可选插件里 ...

  4. 20175316盛茂淞 迭代和JDB

    迭代和JDB 题目 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能 2 m,n 要通过命令行传入 3 提交测试运行截图(至少三张:正常如c( ...

  5. js中加“var”和不加“var”的区别

    JavaScript 拥有动态类型.这意味着相同的变量可用作不同的类型: var x // x 为 undefined var x = 6; // x 为数字 var x = "Bill&q ...

  6. pycharm 如何进行全部搜索

    界面里面先按ctrl F 弹出搜索页面 在搜索框内连续按两次shift shift可以搜索全文

  7. Word中的段落

    Word文档中的块级内容的最基本单位是段落,段落用<p>元素进行存储.段落定义在新行中开始,段落可以包含三方面的信息:可选的段落属性.内嵌的内容(通常为文本)和用于比较两个文档的内容的一组 ...

  8. js-function作用域

    你能猜出先弹出什么吗? <!DOCTYPE html> <html lang="en"><head> <meta charset=&quo ...

  9. 有关C++模板inline的高性能在lambda与function的体现

    前两天在群里跟人讨论到写库时对于lambda和function的取舍,跑了写测试查了些资料后基本得出结论: 如果没有自由变量的情况下,一般不要用function. 如果有自由变量的话,C++中的lam ...

  10. Linux-程序包管理

    Linux上的软件安装有2种形式:源码.二进制文件,源码需要在编译环境下编译安装,二进制可以直接安装. 1.程序包管理器 rpm 程序包管理器能够将目标二进制格式(也就是从源码编译好的二进制文件,包括 ...