`
lvmlvy_1983
  • 浏览: 29563 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Thrift开发实例

    博客分类:
  • java
 
阅读更多

Thrift开发实例

 

准备工作

Thrift主页:http://thrift.apache.org/

Thrift下载:http://thrift.apache.org/download/

下载thrift-0.8.0.tar.gzThrift compiler for Windows (thrift-0.8.0.exe)

创建工作区../thrift

thrift-0.8.0.tar.gzthrift-0.8.0.exe拷贝到../thrift下;

thrift-0.8.0.tar.gz解压到当前目录;

创建start.bat,编辑其内容为:

cd

thrift-0.8.0 --gen java *.thrift

pause

 

简单实例

创建thrift脚本文件:

namespace java com.test.rpc

service TestService{

string getUserName(1:i64 id)

}

执行start.batthrift会根据脚本生成java代码../thrift/gen-java/com/test/rpc/ TestService.java;

创建java project

创建packagecom.test.rpc,将生成的TestService.java拷入;

创建接口实现类TestImpl

package com.test.rpc;

 

import org.apache.log4j.Logger;

import org.apache.thrift.TException;

 

import com.test.rpc.TestService.Iface;

import com.test.user.IUserService;

import com.test.user.UserServiceImpl;

 

 

public class TestImpl implements Iface {

    private static final Logger LOG = Logger.getLogger(TestImpl.class);

   

    @Override

    public String getUserName(long id) throws TException {

        LOG.info("TestImpl server get rpc msg :"+id);

        IUserService userService = new UserServiceImpl();

        String username = userService.getUser(id);

        return username;

    }

 

}

创建RPC server启动线程

package com.test.rpc;

 

import javax.xml.ws.Endpoint;

 

import org.apache.log4j.Logger;

import org.apache.thrift.TProcessor;

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.server.TThreadPoolServer.Args;

import org.apache.thrift.transport.TServerSocket;

import org.apache.thrift.transport.TTransportException;

 

import com.test.service.CommonService;

 

 

 

 

 

public class TestServer extends Thread  {

    private static final Logger LOG = Logger.getLogger(TestServer.class);

   

    @Override

    public void run() {

        try {

            TestImpl testimpl = new TestImpl();

            TServerSocket serverTransport = new TServerSocket(7911);

            Factory proFactory = new TBinaryProtocol.Factory();

            TProcessor processor = new TestService.Processor<TestImpl>(testimpl);

            Args rpcArgs = new Args(serverTransport);

            rpcArgs.processor(processor);

            rpcArgs.protocolFactory(proFactory);

            TServer server = new TThreadPoolServer(rpcArgs);

            LOG.info("Start TestService on port 7911..." + Thread.currentThread().getId() + "["

                + Thread.currentThread().getName() + "]");

            server.serve();

        } catch (TTransportException e) {

            e.printStackTrace();

            LOG.info("TestService.simpleRun", e);

        }

    }

    /**

     * @param args

     */

    public static void main(String[] args)   {

        TestServer server = new TestServer();

        server.start();

    }

 

}

 

 

 

复杂对象实例

与简单实例基本相同,只是脚本不同,参数以对象方式传递,自动生成的java类多一些;

创建thrift脚本文件:

namespace java com.test.rpc

struct User {  

  1: i64 id  

  2: string name  

}

service TestService{

User getUser(1:i64 id)

}

执行start.batthrift会根据脚本生成java代码../thrift/gen-java/com/test/rpc/目录下TestService.javaUser.Java

创建java project

创建packagecom.test.rpc,将生成的TestService.javaUser.Java拷入;

其他步骤类同上例;

 

 

客户端代码

 

package com.test.rpc;

 

import org.apache.log4j.Logger;

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.TTransportException;

import com.test.rpc.TestService.Client;

 

public class TestClient {

    private static final Logger LOG = Logger.getLogger(TestClient.class);

   

    public static void main(String[] args){

        try{

            TSocket tsocket = new TSocket("localhost", 7911);

tsocket.open();

            TProtocol protocol = new TBinaryProtocol(tsocket);

            Client client = new Client(protocol);

            User user = client.getUser(id);

            LOG.info(user.getName());

        }catch (Exception e) {

            LOG.error(e.getMessage(), e);

        }

    }

   

}

 

分享到:
评论
1 楼 张伟_2943 2013-01-09  
[align=center][/align]

    [*]
范德萨发的萨芬[color=violet][/col            or]

相关推荐

Global site tag (gtag.js) - Google Analytics