参考文章: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包如下图)
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();
}
}
}
最后工程的目录结构如下:
5.运行程序
先运行server,再运行client