文档章节

Netty 连接池的使用姿势

jayhu
 jayhu
发布于 2017/03/21 10:04
字数 426
阅读 2242
收藏 0

netty版本 4.1.9.Final

一、类介绍

1.ChannelPool ,连接池接口

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

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

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

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

二、具体使用

我们以http协议的实现来使用连接池,直接上代码

1.ClientPool

public class ClientPool{

    //key为目标host,value为目标host的连接池
    public ChannelPoolMap<InetSocketAddress, FixedChannelPool> poolMap = null;


    public ClientPool(){
        init();
    }

    public void init(){
        EventLoopGroup group = new NioEventLoopGroup();
        final Bootstrap cb = new Bootstrap();

        cb.group(group).channel(NioSocketChannel.class);

        poolMap = new AbstractChannelPoolMap<InetSocketAddress, FixedChannelPool>() {
            @Override
            protected FixedChannelPool newPool(InetSocketAddress key) {
                return new FixedChannelPool(cb.remoteAddress(key), new ChannelPoolHandler() {
                    public void channelReleased(Channel ch) throws Exception {
                        System.out.println("22");
                    }

                    public void channelAcquired(Channel ch) throws Exception {
                        System.out.println("33");
                    }

                    public void channelCreated(Channel ch) throws Exception {
                        //可以在此绑定channel的handler
                        ch.pipeline().addLast(new HttpClientCodec())
                                .addLast(new HttpObjectAggregator(1024 * 1024))
                                .addLast(new HttpBackendHandler());
                    }
                },20);//单个host连接池大小
            }
        };

    }

    public void getHttpClient(InetSocketAddress address,final FullHttpRequest msg) {
        if(address == null){
            throw new RuntimeException("InetSocketAddress can not be null");
        }

        final FixedChannelPool pool = this.poolMap.get(address);

        Future<Channel> f = pool.acquire();

        future.addListener(new FutureListener<Channel>() {

            public void operationComplete(Future<Channel> f) {
                if (f.isSuccess()) {
                    Channel ch = f.getNow();
                    ChannelFuture lastWriteFuture = null;

                    lastWriteFuture = ch.writeAndFlush(msg);

                    // Wait until all messages are flushed before closing the channel.
                    if (lastWriteFuture != null) {

                        try {
                            lastWriteFuture.sync();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                    pool.release(ch);
                }
            }
        });
    }

}

2.HttpBackendHandler

public class HttpBackendHandler extends SimpleChannelInboundHandler<FullHttpResponse> {


    public HttpBackendHandler() {
    }

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("Backend Handler is Active!");
        super.channelActive(ctx);
    }

    @Override
    public void channelRead0(final ChannelHandlerContext ctx, FullHttpResponse msg) throws Exception {
         //todo something
    }
    
    @Override
    public void channelInactive(ChannelHandlerContext ctx) {
        System.out.println("Backend Handler destroyed!");
    }
    
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        if (ctx.channel().isActive()) {
            ctx.channel().writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
        }
    }
}

3.使用

public class NettyHttpClientPoolTest {

    public static void main(String[] args){
        ClientPool pool = new ClientPool();
        InetSocketAddress address = new InetSocketAddress("127.0.0.1",8080;
        FullHttpRequest request = new DefaultFullHttpRequest(..);
        pool.sendMsg(address,request);
    }

}

代码有些未完善,需要自己完善一哈,本文主要是做下学习记录

© 著作权归作者所有

上一篇: solr空间查询
jayhu
粉丝 6
博文 21
码字总数 14106
作品 0
江北
后端工程师
私信 提问
使用Netty实现多路复用的client

Netty只提供的异步传输数据的方式,但是并没有实现多路复用的client。 一个分布式的客户端代码基本是这个样子的: public Response sent(final Request request) { channel.writeAndFlush(re...

亮_dangdang
2014/05/25
12.7K
0
Netty 框架

Netty是Reactor模式事件驱动网络框架,Netty不仅用法简单,而且性能和可靠性都很好,所以被很多的中间件作为网络层使用,像dubbo, RocketMQ底层都采用了Netty。 Netty采用的是Reactor模式,由...

AaronSheng
2016/10/14
248
0
Netty源码—一、server启动(1)

Netty作为一个Java生态中的网络组件有着举足轻重的位置,各种开源中间件都使用Netty进行网络通信,比如Dubbo、RocketMQ。可以说Netty是对Java NIO的封装,比如ByteBuf、channel等的封装让网络...

lacker
2018/07/22
0
0
netty实现Hessian的服务器

最近想开发一个基于Netty的Hessian RPC服务框架,主要是解决TCP连接复用,我的思路是: 1:服务端基于Netty使用Hessian协议实现 2:客户端实现一个TCP连接池,初始化的时候就会加载连接池,那...

timer_xi
2014/12/08
2.2K
1
关于netty的线程

你好: 我看过你的关于netty的帖子。现在我关于netty线程的问题很头大。netty一个连接就是一个work线程。我要做长连接的话,那么就岂不是很多线程。Executors.newCachedThreadPool(),是可伸...

guxuede
2011/11/25
5.2K
10

没有更多内容

加载失败,请刷新页面

加载更多

关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
5
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0
Docker容器实战(七) - 容器中进程视野下的文件系统

前两文中,讲了Linux容器最基础的两种技术 Namespace 作用是“隔离”,它让应用进程只能看到该Namespace内的“世界” Cgroups 作用是“限制”,它给这个“世界”围上了一圈看不见的墙 这么一...

JavaEdge
今天
8
0
文件访问和共享的方法介绍

在上一篇文章中,你了解到文件有三个不同的权限集。拥有该文件的用户有一个集合,拥有该文件的组的成员有一个集合,然后最终一个集合适用于其他所有人。在长列表(ls -l)中这些权限使用符号...

老孟的Linux私房菜
今天
7
0
面试套路题目

作者:抱紧超越小姐姐 链接:https://www.nowcoder.com/discuss/309292?type=3 来源:牛客网 面试时候的潜台词 抱紧超越小姐姐 编辑于 2019-10-15 16:14:56APP内打开赞 3 | 收藏 4 | 回复24 ...

MtrS
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部