http://hanqunfeng.iteye.com/blog/1936556

Thrift网上有N多教程,不再赘述,这里搭建的是WEB项目,使用了spring,所以尽量使用了基于配置的方式。

一。server端

本着少些代码,配置优先的原则,在server端引入代理类,如下:

ThriftServerProxy:使用了反射

Java代码  
  1. public class ThriftServerProxy {
  2. private static Logger logger = Logger.getLogger(ThriftServerStartListener.class);
  3. private int port;// 端口
  4. private String serviceInterface;// 实现类接口
  5. private Object serviceImplObject;//实现类
  6. set and get ……………………
  7. @SuppressWarnings({ "rawtypes", "unchecked" })
  8. public void start() {
  9. new Thread() {
  10. public void run() {
  11. try {
  12. TServerSocket serverTransport = new TServerSocket(getPort());
  13. Class Processor = Class.forName(getServiceInterface()+"$Processor");
  14. Class Iface = Class.forName(getServiceInterface()+"$Iface");                Constructor con = Processor.getConstructor(Iface);
  15. TProcessor processor = (TProcessor)con.newInstance(serviceImplObject);
  16. Factory protFactory = new TBinaryProtocol.Factory(true,true);
  17. TThreadPoolServer.Args args = new TThreadPoolServer.Args(serverTransport);
  18. args.protocolFactory(protFactory);
  19. args.processor(processor);
  20. TServer server = new TThreadPoolServer(args);
  21. logger.info("Starting server on port "+getPort()+" ...");
  22. server.serve();
  23. } catch (TTransportException e) {
  24. e.printStackTrace();
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. }.start();
  30. }
  31. }

 applicationContext-thrift.xml:

Java代码  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. ……………………………………………………
  4. <description>thrift服务</description>
  5. <!-- 声明多个server,并将其关联到该list中,以便监听器自动启动 -->
  6. <util:list id="thriftServerList">
  7. <ref bean="userProxy01" />
  8. <ref bean="userProxy02" />
  9. </util:list>
  10. <bean id="userProxy01" class="thrift.proxy.ThriftServerProxy">
  11. <property name="port" value="7911"/>
  12. <property name="serviceInterface" value="thrift.service.UserService"/>
  13. <property name="serviceImplObject" ref="userServiceImpl"/>
  14. </bean>
  15. <bean id="userProxy02" class="thrift.proxy.ThriftServerProxy">
  16. <property name="port" value="7910"/>
  17. <property name="serviceInterface" value="thrift.service.UserService"/>
  18. <property name="serviceImplObject" ref="userServiceImpl"/>
  19. </bean>
  20. </beans>

使用监听器启动全部服务:

ThriftServerStartListener:

Java代码  
  1. public class ThriftServerStartListener implements ServletContextListener{
  2. private static Logger logger = Logger.getLogger(UserServiceImpl.class);
  3. @Override
  4. public void contextDestroyed(ServletContextEvent event) {
  5. }
  6. @SuppressWarnings("unchecked")
  7. @Override
  8. public void contextInitialized(ServletContextEvent event) {
  9. //启动SETUP SEERVER
  10. try {
  11. ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
  12. List<ThriftServerProxy> list = ((List<ThriftServerProxy>) context.getBean("thriftServerList"));
  13. if(list!=null&&list.size()>0){
  14. for(ThriftServerProxy userProxy:list){
  15. userProxy.start();
  16. }
  17. }
  18. logger.info("Thrift Server监听接口启动。。。。。。。。。。。");
  19. } catch (Exception e) {
  20. logger.error("Thrift Server监听接口启动错误", e);
  21. e.printStackTrace();
  22. }
  23. }
  24. }

二。client端

client使用链接池管理链接,同时对客户端使用代理,spring配置如下:

applicationContext-thrift.xml:

Java代码  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. ……………………………………………………
  4. <description>thrift客户端</description>
  5. <context:property-placeholder
  6. location="classpath:config/properties/thrift.properties" />
  7. <!-- 连接池,管理器,客户端代理,3个一组 -->
  8. <!-- thrift连接池配置7911 -->
  9. <bean id="connectionProvider01" class="thrift.common.ConnectionProviderImpl">
  10. <property name="serviceIP" value="${thrift.ens.ip01}" />
  11. <property name="servicePort" value="${thrift.ens.port01}" />
  12. <property name="maxActive" value="${thrift.ens.maxActive}" />
  13. <property name="maxIdle" value="${thrift.ens.maxIdle}" />
  14. <property name="testOnBorrow" value="${thrift.ens.testOnBorrow}" />
  15. <property name="testOnReturn" value="${thrift.ens.testOnReturn}" />
  16. <property name="testWhileIdle" value="${thrift.ens.testWhileIdle}" />
  17. <property name="conTimeOut" value="${thrift.ens.conTimeOut}" />
  18. </bean>
  19. <!-- thrift连接管理配置7911 -->
  20. <bean id="connectionManager01" class="thrift.common.ConnectionManager">
  21. <property name="connectionProvider" ref="connectionProvider01" />
  22. </bean>
  23. <bean id="userClient01" class="thrift.proxy.ThriftClientProxy">
  24. <property name="serviceInterface" value="thrift.service.UserService" />
  25. <property name="connectionManager" ref="connectionManager01" />
  26. </bean>
  27. <!-- thrift连接池配置7910 -->
  28. <bean id="connectionProvider02" class="thrift.common.ConnectionProviderImpl">
  29. <property name="serviceIP" value="${thrift.ens.ip02}" />
  30. <property name="servicePort" value="${thrift.ens.port02}" />
  31. <property name="maxActive" value="${thrift.ens.maxActive}" />
  32. <property name="maxIdle" value="${thrift.ens.maxIdle}" />
  33. <property name="testOnBorrow" value="${thrift.ens.testOnBorrow}" />
  34. <property name="testOnReturn" value="${thrift.ens.testOnReturn}" />
  35. <property name="testWhileIdle" value="${thrift.ens.testWhileIdle}" />
  36. <property name="conTimeOut" value="${thrift.ens.conTimeOut}" />
  37. </bean>
  38. <!-- thrift连接管理配置 7910-->
  39. <bean id="connectionManager02" class="thrift.common.ConnectionManager">
  40. <property name="connectionProvider" ref="connectionProvider02" />
  41. </bean>
  42. <bean id="userClient02" class="thrift.proxy.ThriftClientProxy">
  43. <property name="serviceInterface" value="thrift.service.UserService" />
  44. <property name="connectionManager" ref="connectionManager02" />
  45. </bean>
  46. </beans>

ThriftClientProxy:

Java代码  
  1. public class ThriftClientProxy {
  2. private String serviceInterface;
  3. private ConnectionManager connectionManager;
  4. set and get……………………
  5. @SuppressWarnings({ "rawtypes", "unchecked" })
  6. public Object getClient() {
  7. Object object = null;
  8. try {
  9. TTransport transport = connectionManager.getSocket();
  10. TProtocol protocol = new TBinaryProtocol(transport);
  11. Class client = Class.forName(getServiceInterface() + "$Client");
  12. Constructor con = client.getConstructor(TProtocol.class);
  13. object = con.newInstance(protocol);
  14. } catch (ClassNotFoundException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. } catch (SecurityException e) {
  18. // TODO Auto-generated catch block
  19. e.printStackTrace();
  20. } catch (NoSuchMethodException e) {
  21. // TODO Auto-generated catch block
  22. e.printStackTrace();
  23. } catch (IllegalArgumentException e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. } catch (InstantiationException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. } catch (IllegalAccessException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. } catch (InvocationTargetException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. }
  36. return object;
  37. }
  38. }

客户端调用,这里使用一个controller:

Java代码  
  1. @Controller
  2. public class IndexController {
  3. @Resource(name="userClient01")
  4. private ThriftClientProxy client01;
  5. @Resource(name="userClient02")
  6. private ThriftClientProxy client02;
  7. @RequestMapping("/index.do")
  8. public String handleIndex(Model model) {
  9. UserService.Client client_01 = (UserService.Client)(client01.getClient());
  10. UserService.Client client_02 = (UserService.Client)(client02.getClient());
  11. String name;
  12. try {
  13. client_01.getUser("zhangsan");
  14. name = client_02.getUserName("zhaosi", 100);
  15. model.addAttribute("userName", name);
  16. } catch (TException e) {
  17. // TODO Auto-generated catch block
  18. e.printStackTrace();
  19. }
  20. return "index";
  21. }
  22. }

连接池部分参考了如下内容:http://wenku.baidu.com/view/d0e91021aaea998fcc220e3d.html

代码详见附件。

http://www.open-open.com/lib/view/open1357804231418.html

Spring集成Thrift--Server AND Client相关推荐

  1. 玩转Spring Cloud之配置中心(config server config client)

    玩转Spring Cloud之配置中心(config server &config client)  本文内容导航: 一.搭建配置服务中心(config server) 1.1.git方式 1 ...

  2. java thrift client_使用thrift的java client调用python server

    上面这篇文章的例子是使用java client调用python server中的helloString方法来打印client传输过去的字符串 thrift文件,hello.thrift service ...

  3. Spring Cloud Feign启动Load balancer does not have available server for client分析

    项目场景: Spring Cloud Feign 学习过程中遇到Feign访问的时候报错Load balancer does not have available server for client ...

  4. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

  5. memcached与spring集成

    一.背景 销售CRM(项目A)将负责管理项目信息系统(项目B)的支付与权限 上级要求为避免频繁调用CRM接口,中间放一级缓存,但要做到缓存中保证最新数据 因项目B已使用memcache作缓存,所以决定 ...

  6. mysql数据实时同步:Canal安装部署、kafka安装、zk安装、mysql安装、Canal Server+Canal Client HA,Canal+mysql+Kafka,相关验证(学习笔记)

    目录 Canal安装部署 1.1. 服务器准备 1.2. 设置主机名并配置hosts 1.3. 免密设置 1.4. 设置ntp时间 1.5. 关闭防火墙 1.6. 关闭selinux 1.7. 安装J ...

  7. resteasy_RESTEasy教程第2部分:Spring集成

    resteasy RESTEasy提供了对Spring集成的支持,这使我们能够将Spring bean作为RESTful WebServices公开. 步骤#1:使用Maven配置RESTEasy + ...

  8. RESTEasy教程第2部分:Spring集成

    RESTEasy提供了对Spring集成的支持,这使我们能够将Spring bean作为RESTful WebServices公开. 步骤#1:使用Maven配置RESTEasy + Spring依赖 ...

  9. RabbitMQ安装和使用(和Spring集成)

    一.安装Rabbit MQ Rabbit MQ 是建立在强大的Erlang OTP平台上,因此安装Rabbit MQ的前提是安装Erlang.通过下面两个连接下载安装3.2.3 版本: 下载并安装 E ...

最新文章

  1. VC++ 6.0下OpengGL配置以及glut配置
  2. winsock setsockopt 详解
  3. [Linux]centOS7-1-1503-x86_64下安装VM-TOOLS
  4. 硬件编程:硬件开发中常用的几种通信接口总结
  5. 前端学习(2783):封装myrequest并绑定到全局
  6. pythoning——11、正则匹配
  7. LR录制脚本后,中文显示的是乱码,怎么解决?
  8. RabbitMQ ACK 机制的意义是什么?
  9. EF6学习笔记十:原始查询,在EF中使用SQL语句
  10. mysql mapinfo_MapInfo常见数据格式
  11. 买的鱼丸怎么做好吃 鱼丸的家常做法介绍
  12. 终端溯源图构建工具SPADE专题-1 SPADE工具安装
  13. Be yourself——《按自己的意愿过一生》读后感
  14. iView级联选择器Cascader回显慢的问题
  15. 构建docker镜像时ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.12/main: network error
  16. 分享一个python生成ico图片程序
  17. powershell 启动时报错 profile.ps1 cannot be loaded because running scri
  18. 几家线上少儿英语(vipkid、哒哒英语等)试听感想
  19. c语言程序教师节祝福,2015年教师节祝福语(大学生适用)
  20. Taro(React)实现具有滚动效果的倒数计时器

热门文章

  1. C# 系统应用之调用SDelete程序粉碎文件及基础原理知识
  2. 【数据结构与算法】之深入解析运用链表结构计算“两数相加”的算法实现
  3. 树莓派AI视觉云台——3、树莓派系统的启动
  4. JAVA数组及数组的应用
  5. ROS(12):双足机器人开发调研
  6. 【C++】 C++标准模板库(四) Set
  7. [Qt教程] 第38篇 网络(八)TCP(二)
  8. linux xps 13 wifi,XPS13-9350安装linux以及网卡连接失败修复的临时方案
  9. Sql注入工具php,phpcms框架SQL注入--基于Havij工具
  10. canoco5冗余分析步骤_Python怎么学习才能效果最好?网友:学习步骤在这了