Netty自带连接池的使用

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

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

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

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

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

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

package com.dxfx.netty.demo;

import com.alibaba.fastjson.JSONObject;
import com.dxfx.netty.framework.Constants;
import com.dxfx.netty.framework.DefaultFuture;
import com.dxfx.netty.framework.NettyClientHandler;
import com.dxfx.netty.param.RequestParam;
import com.dxfx.netty.param.Response;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.pool.AbstractChannelPoolMap;
import io.netty.channel.pool.ChannelPoolHandler;
import io.netty.channel.pool.ChannelPoolMap;
import io.netty.channel.pool.FixedChannelPool;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.FutureListener;

/**
 * Netty自带连接池的用法
 *
 * @author Administrator
 *
 */
public class MyNettyPool {
    // key为目标host,value为目标host的连接池
    public static ChannelPoolMap<String, FixedChannelPool> poolMap;
    private static final Bootstrap bootstrap = new Bootstrap();

    static {
        bootstrap.group(new NioEventLoopGroup());
        bootstrap.channel(NioSocketChannel.class);
        bootstrap.remoteAddress("localhost", 8080);
    }

    public MyNettyPool() {
        init();
    }

    /**
     * netty连接池使用
     *
     */
    public void init() {
        poolMap = new AbstractChannelPoolMap<String, FixedChannelPool>() {

            @Override
            protected FixedChannelPool newPool(String key) {
                ChannelPoolHandler handler = new ChannelPoolHandler() {
                    /**
                     * 使用完channel需要释放才能放入连接池
                     *
                     */
                    @Override
                    public void channelReleased(Channel ch) throws Exception {
                        // 刷新管道里的数据
                        // ch.writeAndFlush(Unpooled.EMPTY_BUFFER); // flush掉所有写回的数据
                        System.out.println("channelReleased......");
                    }

                    /**
                     * 当链接创建的时候添加channelhandler,只有当channel不足时会创建,但不会超过限制的最大channel数
                     *
                     */
                    @Override
                    public void channelCreated(Channel ch) throws Exception {
                        ch.pipeline().addLast(new StringEncoder());
                        ch.pipeline().addLast(new DelimiterBasedFrameDecoder(Integer.MAX_VALUE, Delimiters.lineDelimiter()[0]));
                        ch.pipeline().addLast(new StringDecoder());
                         // 绑定channel的handler
                        ch.pipeline().addLast(new NettyClientHandler());
                    }

                    /**
                     *  获取连接池中的channel
                     *
                     */
                    @Override
                    public void channelAcquired(Channel ch) throws Exception {
                        System.out.println("channelAcquired......");
                    }
                };

                return new FixedChannelPool(bootstrap, handler, 50); //单个host连接池大小
            }
        };

    }

    /**
     * 发送请求
     *
     * @param msg
     *            请求参数
     * @param command
     *            请求方法
     * @return
     */
    public Response send(final Object msg, final String command) {
        //封装请求数据
        final RequestParam request = new RequestParam();
        request.setCommand(command);
        request.setContent(msg);

        //从连接池中获取连接
        final FixedChannelPool pool = poolMap.get("localhost");
        //申请连接,没有申请到或者网络断开,返回null
        Future<Channel> future = pool.acquire();
        future.addListener(new FutureListener<Channel>() {
            @Override
            public void operationComplete(Future<Channel> future) throws Exception {
                //给服务端发送数据
                Channel channel = future.getNow();
                channel.write(JSONObject.toJSONString(request));
                channel.writeAndFlush(Constants.DELIMITER);

                System.out.println(channel.id());
                // 连接放回连接池,这里一定记得放回去
                pool.release(channel);
            }
        });

        //获取服务端返回的数据
        DefaultFuture defaultFuture = new DefaultFuture(request);
        return defaultFuture.get();

    }

}

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

package com.dxfx.netty.demo;

import com.dxfx.netty.param.Response;
import com.dxfx.user.model.User;

/**
 * Netty自带连接池测试类,SpringServer为连接池启动类
 *
 * @author Administrator
 *
 */
public class MyNettyPoolTest {

    public static void main(String[] args) {
        User user = new User();
        user.setAge(12);
        user.setId(23);
        user.setName("client");
        String command = "login";

        MyNettyPool pool = new MyNettyPool();
        new MyThread(pool, user, command).start();
        new MyThread(pool, user, command).start();
        new MyThread(pool, user, command).start();
        new MyThread(pool, user, command).start();
        for (int i = 0; i < 50000; i++) {
            new MyThread(pool, user, command).start();
        }
    }

}

class MyThread extends Thread {

    public MyNettyPool pool;
    public Object msg;
    public String command;

    public MyThread(MyNettyPool pool, Object msg, String command) {
        super();
        this.pool = pool;
        this.msg = msg;
        this.command = command;
    }

    @Override
    public void run() {
        Response response = pool.send(msg, command);
        //System.out.println(response);
    }

}

原文地址:https://www.cnblogs.com/linjiqin/p/10125507.html

时间: 2024-10-21 03:35:07

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

mybatis3整合spring后如何使用自带连接池

mybatis3自带了数据库连接池. 单独使用mybatis3时只需要在mybatis的配置文件中定义datasouce的地方改变type这个属性为POOLED就可以了. 而在整合了spring之后,数据源不再是依靠mybatis的配置文件来定义了.而是通过SqlSessionFactoryBean中的dataSource属性 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactory

php连接池 php–cp

原文地址:http://blog.sina.com.cn/s/blog_9eaa0f400102v9fd.html 数据库连接池php-cp介绍时间 2015-01-23 11:53:05 数据库连接池 php-cpphp-cp(php-connect-pool)是用php扩展写的一个数据库连接池. 我们知道php开发速度快,适合创业快速迭代,但当流量大了之后,php大量的短连接给db层造成多余的消耗,而php处理请求过程中连接会一直持有再加上进程之间不能共享tcp连接会导致撑高mysql的连接

(16)Hibernate对连接池的支持

除非我们用爱去对待一个人,否则我们无法了解他. We never can have a true view of man unless we have a love for him. 1.连接池知识 连接池的作用: 管理连接:提升连接的利用效率! 常用的连接池: C3P0连接池 Hibernate 自带的也有一个连接池,且对C3P0连接池也有支持! Hibernate自带连接池:只维护一个连接,比较简陋. 可以查看hibernate.properties文件(%hibernate%/projec

11、hibernate查询、连接池、二级缓存

Hibernate第三天: 1. 对象状态 2. session缓存 3. lazy懒加载 4. 映射 一对一对映射 组件/继承映射 目标: 一.hibernate查询 二.hibernate对连接池的支持 三.二级缓存 四.Hibernate与Struts小案例(项目中session的管理方式) 一.hibernate查询 查询概述 1)Get/load主键查询 2)对象导航查询 3)HQL查询, Hibernate Query language hibernate 提供的面向对象的查询语言.

浅谈MyBatis3连接池

1.在spring中注入MyBatis自带连接池的时候,仅仅只是设置上了一些数据库连接的必要数据,比如driver.url.username.password等,并不会去连接数据库 2.Mybatis连接池的状态都是由PoolState这个类来维护的,最重要的就是两个list:idleConnections.activeConnections,分别用来保存空闲连接和活动连接,这个PoolState对象在使用过程中需要同步 3.PooledConnection也就是连接池里维护的连接对象,这个类里

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

hibernate查询 查询概述 1) Get/load主键查询 2) 对象导航查询 3) HQL查询, Hibernate Query language hibernate 提供的面向对象的查询语言. 4) Criteria 查询, 完全面向对象的查询(Query By Criteria ,QBC) 5) SQLQuery, 本地SQL查询 缺点:不能跨数据库平台: 如果该了数据库,sql语句有肯能要改 使用场景: 对于复杂sql,hql实现不了的情况,可以使用本地sql查询. HQL查询 p

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

前言 在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式....到目前为止,我们都是使用一些简单的主键查询阿...使用HQL查询所有的数据....本博文主要讲解Hibernate的查询操作,连接池,逆向工程的知识点... get/load主键查询 由于主键查询这个方法用得比较多,于是Hibernate专门为我们封装了起来... get()立即查询 load()懒加载 对象导航查询 如果对象与对象之前存在一对多.多对一的关系的时候 在以前SQL查询的时候:我们如果想要得到

教你正确地利用Netty建立连接池

一.问题描述 Netty是最近非常流行的高性能异步通讯框架,相对于Java原生的NIO接口,Netty封装后的异步通讯机制要简单很多. 但是小K最近发现并不是所有开发人员在使用的过程中都了解其内部实现机制,而是照着葫芦画瓢. 网上简单搜索下,在客户端使用Netty建立连接池的文章也是比较少.今天小K给大家简单介绍下使用Netty建立连接池的方法. 首先我们来看下Netty官方给出的客户端sample实例: //创建一个EventLoopGroup,可以简单认为是Netty框架下的线程池,默认最大

支持并发的http客户端(基于tcp连接池以及netty)

闲来无事,将以前自己写的一个库放出来吧.. 有的时候会有这样子的需求: (1)服务器A通过HTTP协议来访问服务器B (2)服务器A可能会并发的像B发送很多HTTP请求 类似于上述的需求,可能并不常见...因为在业务中确实遇到了这样子的场景,所以就自己动手开发了一个库... 实现原理: (1)底层IO通过netty搞 (2)维护一个tcp的长连接池,这样子就不用每次发送请求还要建立一个tcp连接了... 下面直接来看怎么用吧: (1)最常规的用法,向www.baidu.com发送100次get请