首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Apache Thrift 雙向通信實戰:從 IDL 定義到雙向 RPC 完整落地

     編輯:Java 綜合教學

Apache Thrift 雙向通信實戰:從 IDL 定義到雙向 RPC 完整落地

Thrift 不僅是高效序列化工具,更是完整的跨語言 RPC 框架。本文通過一個「服務端主動推送響應」的雙向通信 Demo,完整演示 IDL 定義、代碼生成、Server/Client 實現與運行驗證。

一、IDL 定義 student.thrift

namespace java com.zhj.student
typedef i32 int
struct Student { 1: string name }
service Zthrift {
    oneway void send(1: Student msg)  // oneway: 僅發送,不等待響應
}

oneway 關鍵字讓客戶端發送後立即返回,為雙向通信騰出連接通道。

二、代碼生成

thrift --gen java student.thrift
# 生成 gen-java/com/zhj/student/Student.java、Zthrift.java

三、服務端實現:非阻塞 I/O + 異步推送

public class ZServer {
    public static void main(String[] args) throws TTransportException {
        TServerSocket socket = new TServerSocket(9999);
        TThreadPoolServer.Args sArgs = new TThreadPoolServer.Args(socket)
            .protocolFactory(new TBinaryProtocol.Factory())
            .processorFactory(new TProcessorFactory() {
                @Override
                public TProcessor getProcessor(TTransport trans) {
                    // 異步線程:5 秒後主動推送響應
                    new Thread(() -> {
                        try { Thread.sleep(5000);
                            Zthrift.Client client = new Zthrift.Client(new TBinaryProtocol(trans));
                            client.send(new Student("server-push-response"));
                        } catch (Exception e) { e.printStackTrace(); }
                    }).start();
                    // 同步處理接收請求
                    return new Zthrift.Processor<>(new Zthrift.Iface() {
                        @Override public void send(Student msg) {
                            System.out.println("收到客戶端: " + msg.name);
                        }
                    });
                }
            });
        new TThreadPoolServer(sArgs).serve();
    }
}

四、客戶端實現:阻塞式接收推送

public class ZClient {
    public static void main(String[] args) throws Exception {
        TSocket socket = new TSocket("127.0.0.1", 9999);
        TTransport transport = new TFramedTransport(socket);
        transport.open();
        Zthrift.Client client = new Zthrift.Client(new TBinaryProtocol(transport));
        // 發送請求
        client.send(new Student("client-request"));
        // 阻塞循環接收服務端推送
        Zthrift.Processor processor = new Zthrift.Processor<>(new Zthrift.Iface() {
            @Override public void send(Student msg) {
                System.out.println("收到服務端推送: " + msg.name);
            }
        });
        while (processor.process(new TBinaryProtocol(transport), new TBinaryProtocol(transport))) {
            // 保持連接處理雙向消息
        }
    }
}

五、運行驗證

  1. 啟動 Server,控制台顯示 start server...
  2. 啟動 Client,立即發送請求
  3. 5 秒後 Server 主動推送,Client 接收並打印

關鍵點:TFramedTransport 以幀為單位傳輸,TThreadPoolServer 線程池隔離業務邏輯,Processor.process() 循環實現雙向消息泵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved