Chinaunix首页 | 论坛 | 博客
  • 博客访问: 404634
  • 博文数量: 21
  • 博客积分: 5030
  • 博客等级: 大校
  • 技术积分: 1275
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-16 09:18
文章分类
文章存档

2012年(1)

2011年(6)

2010年(2)

2009年(1)

2008年(11)

我的朋友

分类: Java

2010-04-20 16:50:49

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.

阅读(5231) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~