Apache Thrift 一个入门简单示例

参考文章:http://www.javabloger.com/article/thrift-java-code-example.html

1.下载 http://mirror.bjtu.edu.cn/apache/thrift/0.8.0/thrift-0.8.0.exe,放在D盘根目录

2.定义Thrift IDL文件:testJava.thrift,也放在D根目录下,内容如下:

namespace java com.javabloger.gen.code   # 注释1   定义生成代码的命名空间,与你需要定义的package相对应。

        struct Blog {   #  注释2.1   定义实体名称和数据结构,类似你业务逻辑中的pojo get/set
            1: string topic     #  注释2.2  参数类型可以参见 Thrift wiki  
            2: binary content 
            3: i64    createdTime
            4: string id
            5: string ipAddress
            6: map<string,string> props
          }
        service ThriftCase {  #  注释3    代码生成的类名,你的业务逻辑代码需要实现代码生成的ThriftCase.Iface接口
            i32 testCase1(1:i32 num1, 2:i32 num2, 3:string  num3) #注释4.1 方法名称和方法中的入参,入参类型参见wiki
            list<string> testCase2(1:map<string,string>  num1)
            void testCase3()
            void testCase4(1:list<Blog> blog)   #  注释4.2   list 是thrift中基本数据类型中的一种,list中包含的Blog对象是上面struct中定义的
        }

3.命令提示符,进入D盘根目录:执行thrift-0.8.0.exe -gen java testJava.thrift,会出现一个文件夹gen-java,里面有Blog.java,ThriftCase.java两个文件

4.构建maven工程,pom.xml文件里加入依赖:

<dependency>
    <groupId>org.apache.thrift</groupId>
    <artifactId>libthrift</artifactId>
    <version>0.8.0</version>
  </dependency>

<dependency>  
            <groupId>org.slf4j</groupId>  
            <artifactId>slf4j-api</artifactId>  
            <version>1.5.8</version>   

</dependency>
<dependency>  
            <groupId>org.slf4j</groupId>  
            <artifactId>slf4j-log4j12</artifactId>  
            <version>1.5.8</version>   

</dependency>

将3中生成的文件拷入工程中。(如果不用maven,可以将依赖的jar加入工程即可,jar包如下图)

Apache Thrift 一个入门简单示例_第1张图片

5.创建具体业务business,服务器server,客户端client,

BusinessImpl.java:

package com.javabloger.gen.code.business;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.thrift.TException;

import com.javabloger.gen.code.Blog;
import com.javabloger.gen.code.ThriftCase;

public class BusinessImpl implements ThriftCase.Iface {

 @Override
 public int testCase1(int num1, int num2, String num3) throws TException {
  int i = num1 + num2;
  System.out.print("testCase1  num1+num2 is :" + i);
  System.out.println("   num3 is :" + num3);
  return i;
 }

 @Override
 public List<String> testCase2(Map<String, String> num1) throws TException {
  System.out.println("testCase2 num1 :" + num1);
  List<String> list = new ArrayList<String>();
  list.add("num1");
  return list;
 }

 @Override
 public void testCase3() throws TException {
  System.out.println("testCase3 ..........." + new java.util.Date());
 }

 @Override
 public void testCase4(List<Blog> blogs) throws TException {
  System.out.print("testCase4 ...........");

  for (int i = 0; i < blogs.size(); i++) {
   Blog blog = blogs.get(i);
   System.out.print("id:" + blog.getId());
   System.out.print(",IpAddress:" + blog.getIpAddress());
   System.out.print(",Content:" + new String(blog.getContent()));
   System.out.print(",topic:" + blog.getTopic());
   System.out.print(",time:" + blog.getCreatedTime());
   System.out.println();
  }
  System.out.println("\n");
 }

}

 

Server.java:

package com.javabloger.gen.code.transport;

import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TCompactProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.server.TThreadPoolServer.Args;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;

import com.javabloger.gen.code.ThriftCase;
import com.javabloger.gen.code.business.BusinessImpl;

public class Server {
 private void start() {
  try {
   TServerSocket serverTransport = new TServerSocket(7911);
   ThriftCase.Processor processor = new ThriftCase.Processor( new BusinessImpl() );
   Factory protFactory = new TCompactProtocol.Factory();
   
//   Factory portFactory = new TBinaryProtocol.Factory(true, true);
   Args args = new Args(serverTransport);
   args.processor(processor);
   args.protocolFactory(protFactory);
//   TServer server = new TThreadPoolServer(processor, serverTransport, protFactory);
   TServer server = new TThreadPoolServer(args);
   System.out.println("Starting server on port 7911 ...");
   server.serve();

  } catch (TTransportException e) {
   e.printStackTrace();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public static void main(String args[]) {
  Server srv = new Server();
  srv.start();
 }
}

 

Client.java:

package com.javabloger.gen.code.client;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.thrift.TException;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;

import com.javabloger.gen.code.Blog;
import com.javabloger.gen.code.ThriftCase;

public class Client {

 static Map<String, String> map = new HashMap<String, String>();
 static List<Blog> blogs = new ArrayList<Blog> ();
 
 public static void main(String[] args) throws Exception {
  try {
   TTransport transport = new TSocket("localhost", 7911);
   TProtocol protocol = new TCompactProtocol(transport);
   ThriftCase.Client client = new ThriftCase.Client(protocol);
   transport.open();
   System.out.println("Client calls .....");
   map.put("blog", "http://www.javabloger.com");

   client.testCase1(10, 21, "3");
   client.testCase2(map);
   client.testCase3();

   
   Blog blog= new Blog();
   blog.setContent("this is blog content".getBytes());
   blog.setCreatedTime(System.currentTimeMillis() );
   blog.setId("123456");
   blog.setIpAddress("127.0.0.1");
   blog.setTopic("this is blog topic");
   blogs.add(blog);
   blogs.add(blog);
   blogs.add(blog);
   blogs.add(blog);
   
   client.testCase4(blogs);
   
   transport.close();
  } catch (TException x) {
   x.printStackTrace();
  }
 }
}

最后工程的目录结构如下:

Apache Thrift 一个入门简单示例_第2张图片

 

5.运行程序
先运行server,再运行client

你可能感兴趣的:(Apache Thrift 一个入门简单示例)