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是源码,感谢阅读!!!
相关推荐
在"Apache Thrift 初学小讲(五)【代理】"这篇博文中,我们将探讨Thrift如何实现代理服务,这在分布式系统中非常关键,因为代理可以提供负载均衡、安全控制、监控等功能。 1. **接口定义语言(IDL)**:Thrift ...
在本篇初学小讲中,我们将重点关注Thrift在负载均衡方面的应用,这对于构建大型分布式系统至关重要。Thrift通过提供一种高效的数据序列化机制以及RPC(远程过程调用)接口,使得不同编程语言之间可以轻松地进行通信...
在本篇小讲中,我们将探讨如何将Thrift与Spring框架结合,以便于构建微服务架构。 首先,让我们了解Thrift的基本工作原理。Thrift IDL(接口定义语言)允许开发者声明服务方法和数据类型,类似于Java中的接口或C++...
在“Apache Thrift 初学小讲(三)【http】”中,我们将深入探讨Thrift如何与HTTP协议相结合,实现基于HTTP的服务通信。 首先,Thrift 提供了一个名为 `ThriftServlet` 的组件,它是将Thrift服务与Java Servlet容器...
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 是一个开源的软件框架,用于构建可伸缩的、跨语言的服务。它结合了接口定义语言(IDL)和库,允许开发者定义数据结构和服务接口,然后自动生成多种编程语言的代码,使得不同语言之间可以高效地进行...
标题中的“thriftpool”是一个专门为Thrift RPC(Remote Procedure Call)服务设计的连接池实现,它基于Apache Commons Pool库。Apache Thrift是一种软件框架,用于构建跨语言的服务,它允许不同编程语言之间高效地...
Apache Thrift 是一款由 Facebook 开发的开源框架,主要用于构建跨语言的服务。Thrift 提供了一个集成的代码生成工具,允许开发者定义数据类型和服务接口,然后自动生成多种编程语言(如 C++ 和 Java)的客户端和...
本例改编自Apache Thrift教程: ... ... 原教程使用的是c++ server和php client. 我用c++和c#分别实现了client和server,他们之间可以用任意组合互相调用,没有太复杂的功能,非常利于初学Thrift.
在Java环境中使用Apache Thrift,我们可以从以下几个方面来深入理解: 1. **Thrift IDL(接口定义语言)**:Thrift IDL是一种类似于C++头文件的文本文件格式,用于定义服务和数据结构。通过定义服务接口和数据类型...
Apache Thrift 是一款开源的软件框架,主要用于构建可扩展且跨语言的服务。它结合了编译器和库,能够高效地构建分布式系统。在Java领域,Thrift 提供了一种简洁的方式来实现远程过程调用(RPC)服务。在这个实战源码...
Apache Thrift程序员指南以下示例中的源代码:Apache Thrift程序员指南 本书分为三个部分:第一部分-Apache Thrift概述对Apache Thrift及其体系结构的高级介绍。 这部分的例子非常有趣。 本部分还介绍了基本的Apache...
Java中有很多成熟的连接池实现,如HikariCP、Apache Commons Pool等,这些库可以集成到Thrift客户端,确保高效地复用连接,提高服务性能。 最后,性能监控对于理解系统的运行状态至关重要。在Thrift服务中,我们...
而集成连接池,比如Apache Commons Pool或HikariCP,可以有效地管理Thrift客户端的连接,提高服务的响应速度和资源利用率,避免频繁的连接创建和销毁。 总的来说,Thrift因其高性能、跨语言特性和丰富的库支持,...
Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用框架。它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++,Java, Python,...
该项目是《RPC框架实践之:Apache Thrift》博文所对应的实践设计源码,总计包含30个文件,其中Java源文件8个,XML配置文件3个,属性文件2个,以及其他文件如DS_Store、LICENSE和md等。该项目通过SpringBoot整合...
Apache Thrift 是一个开源的跨语言服务开发框架,它由Facebook于2007年创建,现由Apache软件基金会维护。Thrift的主要目标是解决在分布式系统中不同编程语言之间高效、安全的数据通信问题。通过Thrift,开发者可以...