Thrift 是facebook的核心技术之一,
使用不同开发语言开发的系统可以通过该框架实现彼此间的通讯,开发者只需编辑一份thrift脚本,即可自动获得其它开发语言的代码(比如 c++ java python ruby c# haskell ocmal erlang cocoa php squeak).同时提供了完整的rpc service framework,可以很方便的直接构建服务。
简单实现一个User Activity的log服务和客户端,只是作简单的演示,所以没有实现异步调用等缓冲机制(比如Queue),具体实现可以根据自己的情况定制。
目标:实现一个user activity log 服务。
step 1:安装Thrift
step 2:编写Thrift脚本,存为DataReceiver.thrift
namespace java thrift.test
struct Activity{
1: i64 uid,
2: i32 type,
3: i64 timestamp,
4: map<string,string> maps,
}
service DataReceiver{
oneway void postData(1: Activity ac),
oneway void postDataArray(1: list<Activity> arg),
}
|
step 3:生成代码
thrift --gen java DataReceiver.thrift
|
step 4:根据需要,编写自己的代码
a.server实现类
package com.happyelements.DataCenter;
import java.util.List;
import org.apache.thrift.TException;
public class DataServerImpl implements DataReceiver.Iface{
@Override
public void postData(Activity ac) throws TException {
// TODO Auto-generated method stub //这里写自己的定制代码
}
@Override
public void postDataArray(List<Activity> arg) throws TException {
// TODO Auto-generated method stub
//这里写自己的定制代码
long time = System.currentTimeMillis();
System.out.println("postDataArray called timestamp: " + time);
List<Activity> activities = arg;
System.out.println("len = "+activities.size());
for(int i=0; i<activities.size(); i++){
Activity ac = activities.get(i);
System.out.println(ac.getUid());
System.out.println(ac.getType());
System.out.println(ac.getMaps().get("foo"));
}
}
}
|
b.服务器
package com.happyelements.DataCenter;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
public class DataServer {
private void start(){
try {
TServerSocket serverTransport = new TServerSocket(8811);
DataReceiver.Processor processor = new DataReceiver.Processor(new DataServerImpl());
Factory protFactory = new TBinaryProtocol.Factory(true, true);
TServer server = new TThreadPoolServer(processor, serverTransport, protFactory);
System.out.println("Starting server on port 8811 ...");
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
DataServer srv = new DataServer();
srv.start();
}
}
|
c.客户端
package com.happyelements.DataCenter;
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.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
import com.happyelements.DataCenter.DataReceiver.Client;
public class TestClient {
private void start() {
TTransport transport;
try {
transport = new TSocket("localhost", 8811);
TProtocol protocol = new TBinaryProtocol(transport);
Client client = new Client(protocol);
transport.open();
List<Activity> la = new ArrayList<Activity>();
Activity ac = new Activity();
ac.setType(1);
ac.setUid(12345);
Map<String, String> map = new HashMap<String, String>();
map.put("foo", "blablabla...");
ac.setMaps(map);
la.add(ac);
client.postDataArray(la);
transport.close();
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
TestClient c = new TestClient();
c.start();
}
}
|
以上代码需要的jar包:
libthrift.jar
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.8.jar
log4j-1.2.15.jar
ok. thats all.
阅读(1988) | 评论(0) | 转发(0) |