`
halloffame
  • 浏览: 55724 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Apache Thrift 初学小讲(四)【用Apache Commons Pool实现连接池】

阅读更多

Apache Thrift本身没有提供连接池,我们可以用Apache Commons Pool来实现一个,Apache commons-pool本质上是"对象池",即通过一定的规则来维护对象集合的容器;commos-pool在很多场景中,用来实现连接池/任务worker池等,大家常用的dbcp数据库连接池,也是基于commons-pool实现的。TCP连接池里的是Socket对象,那么对于thirft连接池里的就是TTransport对象了。

 

参考了这篇文章:http://www.open-open.com/lib/view/open1415453575730.html,但上官网http://commons.apache.org/proper/commons-pool/download_pool.cgi下载jar时,发现官网上的例子的用法和上面那篇文章的例子的用法有点出入,才发现现在最新版是2.4.2,是重构过的,连包名pool都改成了pool2,不向下兼容的。官网poo2的例子:http://commons.apache.org/proper/commons-pool/examples.html

 

据说poo2显著的提升了性能和可伸缩性,特别是在高并发加载的情况下。2.0 版本包含可靠的实例跟踪和池监控,要求 JDK 1.6 或者更新版本。poo2使用了泛型,不用再把object强制转换为你的对象类型了。

 

简单使用时主要涉及几个类:

GenericObjectPool:对象池类,可以获取和归还一个对象PooledObject等;

BasePooledObjectFactory:对象池GenericObjectPool里管理的对象的工厂类,池可以通过此工厂类创建和销毁一个对象PooledObject等;

GenericObjectPoolConfig:对象池GenericObjectPool的配置类,例如最大连接数,最大和最小空闲连接数等;

 

查看GenericObjectPool的构造方法,刚好两个参数分别是BasePooledObjectFactory和GenericObjectPoolConfig,而BasePooledObjectFactory是需要我们继承来实现相应的方法的,简单点实现两个抽象方法create和wrap即可,而wrap用默认实现new一个DefaultPooledObject就可以了。所以其实我们只需要实现create方法就行了。

 

有没有发现poo1是通过实现makeObject方法来创建池对象的,而poo2是create方法,同时poo2也有一个

makeObject方法,好像有点多余或者矛盾,我们查看poo2的BasePooledObjectFactory的源码发现其实poo2也是通过makeObject来创建一个池对象的,只不过里面依次调用了create和wrap,create了一个你的对象后,再把这个对象wrap成池管理类型的对象PooledObject。

 

源码:org.apache.commons.pool2.BasePooledObjectFactory-》makeObject:

package org.apache.commons.pool2;

public abstract class BasePooledObjectFactory<T> implements PooledObjectFactory<T> {   
    public abstract T create() throws Exception;
    public abstract PooledObject<T> wrap(T obj);
           
    @Override
    public PooledObject<T> makeObject() throws Exception {
        return wrap(create());
    }
    
    @Override
    public void destroyObject(PooledObject<T> p)
        throws Exception  {
    }
    @Override
    public boolean validateObject(PooledObject<T> p) {
        return true;
    }
    @Override
    public void activateObject(PooledObject<T> p) throws Exception {
    }
    @Override
    public void passivateObject(PooledObject<T> p)
        throws Exception {
    }
}

 

关门,放代码:

连接池工厂类ConnectionPoolFactory.java:

import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig; 
import org.apache.thrift.transport.TFastFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport; 
  
public class ConnectionPoolFactory {  
    private GenericObjectPool<TTransport> pool;  
  
    public ConnectionPoolFactory(GenericObjectPoolConfig config, String ip, int port) {  
    	ConnectionFactory objFactory = new ConnectionFactory(ip, port, 3000);  
        pool = new GenericObjectPool<TTransport>(objFactory, config);  
    }  
    
    //从池里获取一个Transport对象
    public TTransport getConnection() throws Exception {  
        return pool.borrowObject();  
    }  
    
    //把一个Transport对象归还到池里
    public void releaseConnection(TTransport transport) {  
        pool.returnObject(transport);   
    }  
    
    /*
     * 连接池管理的对象Transport的工厂类,
     * GenericObjectPool会使用此类的create方法来
     * 创建Transport对象并放进pool里进行管理等操作。
     */
    class ConnectionFactory extends BasePooledObjectFactory<TTransport> {   
    	private String ip;  
        private int port;
        private int socketTimeout;
          
        public ConnectionFactory(String ip, int port, int socketTimeout) {  
        	this.ip = ip;
        	this.port = port;
        	this.socketTimeout = socketTimeout;
        }  
        
        //创建TTransport类型对象方法
        @Override
		public TTransport create() throws Exception {
			TSocket socket = new TSocket(ip, port);
	        socket.setTimeout(socketTimeout);
	        TTransport transport = socket;
	        transport = new TFastFramedTransport(transport);
	        if ( !transport.isOpen() ) {
	        	transport.open();
	        }
			return transport;
		}

        //把TTransport对象打包成池管理的对象PooledObject<TTransport>
		@Override
		public PooledObject<TTransport> wrap(TTransport transport) {
			return new DefaultPooledObject<TTransport>(transport);
		}
  
    }       
} 

 

使用连接池的客户端类TestPoolClient.java:

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TTransport;

import thrift.test.ThriftTest;
import thrift.test.User;

public class TestPoolClient {
    public static void main(String [] args) throws Exception {
	    GenericObjectPoolConfig config = new GenericObjectPoolConfig();
	    //链接池中最大连接数,默认为8
        config.setMaxTotal(2); 
        //当连接池资源耗尽时,调用者最大阻塞的时间,超时将跑出异常。单位:毫秒;默认为-1,表示永不超时
        config.setMaxWaitMillis(3000);
        ConnectionPoolFactory poolFactory = new ConnectionPoolFactory(config, "127.0.0.1", 9090);  
        //从连接池取得指定的通信方式
        TTransport transport = poolFactory.getConnection(); 
        
        //指定的通信协议
	    TProtocol tProtocol = new TCompactProtocol(transport); 
	    //ThriftTest.Client是生成的客户端代码
	    ThriftTest.Client testClient = new ThriftTest.Client(tProtocol);
        
        //getUser就是ThriftTest.thrift所定义的接口
        User user = testClient.getUser(2); 
        System.out.println("名字:"+ user.getName());
        
        //归还transport到连接池
        poolFactory.releaseConnection(transport);
    }
}

 

运行TestServer.java,再运行TestPoolClient.java,结果:

(服务端打印)Starting the server on port 9090...

(客户端打印)名字:另外一个烟火

 

工程结构图:


 

附近src.rar是源码,感谢阅读!!!

  • src.rar (11.8 KB)
  • 下载次数: 38
1
0
分享到:
评论

相关推荐

    Apache Thrift 初学小讲(五)【代理】

    在"Apache Thrift 初学小讲(五)【代理】"这篇博文中,我们将探讨Thrift如何实现代理服务,这在分布式系统中非常关键,因为代理可以提供负载均衡、安全控制、监控等功能。 1. **接口定义语言(IDL)**:Thrift ...

    Apache Thrift 初学小讲(七)【负载均衡】

    在本篇初学小讲中,我们将重点关注Thrift在负载均衡方面的应用,这对于构建大型分布式系统至关重要。Thrift通过提供一种高效的数据序列化机制以及RPC(远程过程调用)接口,使得不同编程语言之间可以轻松地进行通信...

    Apache Thrift 初学小讲(六)【spring】

    在本篇小讲中,我们将探讨如何将Thrift与Spring框架结合,以便于构建微服务架构。 首先,让我们了解Thrift的基本工作原理。Thrift IDL(接口定义语言)允许开发者声明服务方法和数据类型,类似于Java中的接口或C++...

    Apache Thrift 初学小讲(三)【http】

    在“Apache Thrift 初学小讲(三)【http】”中,我们将深入探讨Thrift如何与HTTP协议相结合,实现基于HTTP的服务通信。 首先,Thrift 提供了一个名为 `ThriftServlet` 的组件,它是将Thrift服务与Java Servlet容器...

    the programmer's guide to apache thrift

    Apache Thrift is an open source cross language serialization and RPC framework. With support for over 15 programming languages, Apache Thrift can play an important role in a range of distributed ...

    Apache Thrift 初学小讲(八)【zookeeper实现服务注册与发现】

    Apache Thrift 是一个开源的软件框架,用于构建可伸缩的、跨语言的服务。它结合了接口定义语言(IDL)和库,允许开发者定义数据结构和服务接口,然后自动生成多种编程语言的代码,使得不同语言之间可以高效地进行...

    thriftpool:Thrift RPC连接池,java实现,基于apache commons pool

    标题中的“thriftpool”是一个专门为Thrift RPC(Remote Procedure Call)服务设计的连接池实现,它基于Apache Commons Pool库。Apache Thrift是一种软件框架,用于构建跨语言的服务,它允许不同编程语言之间高效地...

    Apache Thrift 使用说明

    Apache Thrift 是一款由 Facebook 开发的开源框架,主要用于构建跨语言的服务。Thrift 提供了一个集成的代码生成工具,允许开发者定义数据类型和服务接口,然后自动生成多种编程语言(如 C++ 和 Java)的客户端和...

    用C#和C++写的Apache Thrift的小范例

    本例改编自Apache Thrift教程: ... ... 原教程使用的是c++ server和php client. 我用c++和c#分别实现了client和server,他们之间可以用任意组合互相调用,没有太复杂的功能,非常利于初学Thrift.

    Learning Apache Thrift

    在Java环境中使用Apache Thrift,我们可以从以下几个方面来深入理解: 1. **Thrift IDL(接口定义语言)**:Thrift IDL是一种类似于C++头文件的文本文件格式,用于定义服务和数据结构。通过定义服务接口和数据类型...

    Apache Thrift Java实战源码,包含了客户端和服务端源码

    Apache Thrift 是一款开源的软件框架,主要用于构建可扩展且跨语言的服务。它结合了编译器和库,能够高效地构建分布式系统。在Java领域,Thrift 提供了一种简洁的方式来实现远程过程调用(RPC)服务。在这个实战源码...

    ThriftBook:《 Apache Thrift程序员指南》中示例的源代码

    Apache Thrift程序员指南以下示例中的源代码:Apache Thrift程序员指南 本书分为三个部分:第一部分-Apache Thrift概述对Apache Thrift及其体系结构的高级介绍。 这部分的例子非常有趣。 本部分还介绍了基本的Apache...

    基于thrift的rpc框架,在thrift基础上增加负载均衡,连接池,性能监控.zip

    Java中有很多成熟的连接池实现,如HikariCP、Apache Commons Pool等,这些库可以集成到Thrift客户端,确保高效地复用连接,提高服务性能。 最后,性能监控对于理解系统的运行状态至关重要。在Thrift服务中,我们...

    thrift服务集成spring及连接池

    而集成连接池,比如Apache Commons Pool或HikariCP,可以有效地管理Thrift客户端的连接,提高服务的响应速度和资源利用率,避免频繁的连接创建和销毁。 总的来说,Thrift因其高性能、跨语言特性和丰富的库支持,...

    Apache Thrift——可伸缩的跨语言服务开发框架

    Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用框架。它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++,Java, Python,...

    基于SpringBoot的Apache Thrift RPC框架实践设计源码

    该项目是《RPC框架实践之:Apache Thrift》博文所对应的实践设计源码,总计包含30个文件,其中Java源文件8个,XML配置文件3个,属性文件2个,以及其他文件如DS_Store、LICENSE和md等。该项目通过SpringBoot整合...

    Apache Thrift - 可伸缩的跨语言服务开发框架(代码已修正)

    Apache Thrift 是一个开源的跨语言服务开发框架,它由Facebook于2007年创建,现由Apache软件基金会维护。Thrift的主要目标是解决在分布式系统中不同编程语言之间高效、安全的数据通信问题。通过Thrift,开发者可以...

Global site tag (gtag.js) - Google Analytics