Java Thrift Server Sample

51 篇文章 0 订阅
36 篇文章 0 订阅
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.

以下是使用Java连接Spark Thrift Server的一些步骤: 1. 首先,您需要下载并安装适当的JDBC驱动程序,以便Java应用程序能够与Spark Thrift Server进行通信。您可以在以下链接中找到不同数据库的JDBC驱动程序:https://docs.databricks.com/integrations/bi/jdbc-odbc-bi.html#jdbc-driver-download 2. 在Java项目中导入JDBC驱动程序的JAR文件。 3. 创建一个新的Java类,并在类中添加以下代码: ``` import java.sql.*; public class SparkThriftServer { public static void main(String[] args) { String url = "jdbc:hive2://<spark-thrift-server-host>:<port>/default"; String user = "<username>"; String password = "<password>"; String query = "SELECT * FROM <table-name>"; try { // Establish connection Connection conn = DriverManager.getConnection(url, user, password); // Execute query Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query); // Process results while (rs.next()) { // Retrieve data from the result set int id = rs.getInt("id"); String name = rs.getString("name"); System.out.printf("ID: %d, Name: %s\n", id, name); } // Clean up rs.close(); stmt.close(); conn.close(); } catch (SQLException e) { System.err.println("Error executing query: " + e.getMessage()); } } } ``` 在上面的代码中,请确保更改以下值: - `<spark-thrift-server-host>`:Spark Thrift Server的主机名或IP地址。 - `<port>`:Spark Thrift Server正在侦听的端口。 - `<username>`:连接到Spark Thrift Server的用户名。 - `<password>`:连接到Spark Thrift Server的密码。 - `<table-name>`:从中检索数据的表名。 4. 运行Java应用程序,应该可以连接到Spark Thrift Server并从表中检索数据。 请注意,上面的示例是使用Hive2 JDBC驱动程序连接到Spark Thrift Server的示例。如果您使用的是不同的数据库,需要使用相应的JDBC驱动程序和URL。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值