欢迎访问宙启技术站
智能推送

Thrift.Thrift.TApplicationExceptionUNKNOWN_METHOD:异常的未知方法调用

发布时间:2023-12-19 01:43:02

Thrift是一种多语言的RPC框架,用于构建可扩展的、高效的分布式服务。在Thrift中,当客户端调用了一个不存在的方法时,会抛出一个TApplicationExceptionUNKNOWN_METHOD异常。

异常的未知方法调用通常发生在以下几种情况下:

1. 客户端调用了服务端不存在的方法。

2. 客户端和服务端使用的Thrift文件不一致,导致客户端调用了服务端不存在的方法。

3. 客户端和服务端使用的Thrift库版本不一致,导致客户端调用了服务端不存在的方法。

下面以一个简单的示例来说明异常的未知方法调用:

1. 定义Thrift文件

首先,我们需要定义一个Thrift文件,包含一个服务和一些方法。在这个例子中,我们定义了一个Calculator服务,该服务有两个方法:add和subtract。

namespace java com.example.thrift
service Calculator {
  i32 add(1:i32 num1, 2:i32 num2),
  i32 subtract(1:i32 num1, 2:i32 num2)
}

2. 生成代码

使用Thrift编译器生成Java代码。

thrift --gen java Calculator.thrift

3. 实现服务端

编写一个Java类实现Calculator服务。

package com.example.server;

import com.example.thrift.Calculator;

public class CalculatorHandler implements Calculator.Iface {
    @Override
    public int add(int num1, int num2) {
        return num1 + num2;
    }

    @Override
    public int subtract(int num1, int num2) {
        return num1 - num2;
    }
}

4. 启动服务端

package com.example.server;

import com.example.thrift.Calculator;
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocolFactory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;

public class Server {
    public static void main(String[] args) {
        try {
            TServerSocket serverSocket = new TServerSocket(8080);
            CalculatorHandler handler = new CalculatorHandler();
            Calculator.Processor<TProcessor> processor = new Calculator.Processor<>(handler);

            TProtocolFactory protocolFactory = new TBinaryProtocol.Factory();
            TServer.Args serverArgs = new TServer.Args(serverSocket)
                    .protocolFactory(protocolFactory)
                    .processor(processor);
            
            TServer server = new TSimpleServer(serverArgs);
            server.serve();
        } catch (TTransportException e) {
            e.printStackTrace();
        }
    }
}

5. 编写客户端

编写一个Java类来调用Calculator服务的add和未知方法multiply。

package com.example.client;

import com.example.thrift.Calculator;
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;

public class Client {
    public static void main(String[] args) {
        try {
            TTransport transport = new TSocket("localhost", 8080);
            transport.open();

            TProtocol protocol = new TBinaryProtocol(transport);
            Calculator.Client client = new Calculator.Client(protocol);

            int num1 = 10;
            int num2 = 5;

            int sum = client.add(num1, num2);
            System.out.println("10 + 5 = " + sum);

            int product = client.multiply(num1, num2);
            System.out.println("10 * 5 = " + product);

            transport.close();
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        }
    }
}

6. 运行客户端

java -cp target/classes:target/dependency/* com.example.client.Client

当客户端运行时,会抛出一个异常:Thrift.TApplicationExceptionUNKNOWN_METHOD。这是因为客户端调用了未知方法multiply。

Exception in thread "main" thrift.Thrift$TApplicationException: Unknown method multiply
	at com.example.thrift.Calculator$Client.recv_multiply(Calculator.java:166)
	at com.example.thrift.Calculator$Client.multiply(Calculator.java:147)
	at com.example.client.Client.main(Client.java:23)

通过以上示例,我们可以看到当客户端调用了一个未知方法时,Thrift会抛出TApplicationExceptionUNKNOWN_METHOD异常。这个异常可以帮助我们快速定位并解决问题,例如检查服务端和客户端使用的Thrift文件、Thrift库版本是否一致等。