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

Thrift.Thrift.TApplicationExceptionUNKNOWN_METHOD:找不到请求的方法名

发布时间:2023-12-26 23:00:12

Thrift.TApplicationExceptionUNKNOWN_METHOD异常表示找不到请求的方法名。这种异常通常发生在使用Thrift进行远程过程调用时,客户端发送了一个无效的方法名,或者服务端没有实现客户端请求的方法。下面是一个使用Thrift进行远程过程调用的示例,包括客户端和服务端的代码。

# thrift文件
# Calculator.thrift
namespace py example

service Calculator {
    i32 add(1: i32 a, 2: i32 b) throws (1: TException ex),
    i32 subtract(1: i32 a, 2: i32 b) throws (1: TException ex)
}

# 服务端代码
# server.py
import sys
sys.path.append('gen-py')

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer

from example import Calculator
from example.ttypes import TException

class CalculatorHandler:
    def add(self, a, b):
        return a + b

    def subtract(self, a, b):
        return a - b

if __name__ == '__main__':
    try:
        handler = CalculatorHandler()
        processor = Calculator.Processor(handler)
        transport = TSocket.TServerSocket('localhost', 9090)
        tfactory = TTransport.TBufferedTransportFactory()
        pfactory = TBinaryProtocol.TBinaryProtocolFactory()

        server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
        print('Starting the server...')
        server.serve()
    except Thrift.TException as ex:
        print(ex.message)

# 客户端代码
# client.py
import sys
sys.path.append('gen-py')

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol

from example import Calculator
from example.ttypes import TException

if __name__ == '__main__':
    try:
        transport = TSocket.TSocket('localhost', 9090)
        transport = TTransport.TBufferedTransport(transport)
        protocol = TBinaryProtocol.TBinaryProtocol(transport)
        client = Calculator.Client(protocol)

        transport.open()
        print('Client connected to the server')

        # 请求一个不存在的方法
        result = client.multiply(5, 6)
        print('Result:', result)

        transport.close()
    except Thrift.TApplicationException as ex:
        print('Thrift.TApplicationException:', ex.message)

在上面的示例中,服务端实现了一个简单的Calculator服务,包含add和subtract两个方法。客户端连接到服务端,并发送一个名为multiply的不存在的方法请求。这将导致服务端抛出Thrift.TApplicationExceptionUNKNOWN_METHOD异常,客户端捕获异常并打印错误消息。

这个示例演示了Thrift.TApplicationExceptionUNKNOWN_METHOD异常的用法,客户端请求了一个不存在的方法,导致服务端抛出异常。当使用Thrift进行远程过程调用时,确保客户端请求的方法名存在,并且服务端实现了对应的方法,以避免此类异常的发生。