Thrift.Thrift.TApplicationExceptionUNKNOWN_METHOD:不可识别的方法名
Thrift.TApplicationExceptionUNKNOWN_METHOD是Thrift框架中的一个异常类,用于表示调用服务时出现了未知的方法名。当客户端向服务端发起请求时,如果请求的方法名在服务端定义的接口中找不到对应的方法,服务端就会抛出Thrift.TApplicationExceptionUNKNOWN_METHOD异常。
下面我们以一个简单的示例来演示如何在Thrift中使用Thrift.TApplicationExceptionUNKNOWN_METHOD异常。
首先,我们需要定义一个Thrift的IDL文件,其中包含一个服务接口和对应的方法。示例IDL文件名为example.thrift,内容如下:
namespace java com.example.thrift
service ExampleService {
string helloWorld()
}
定义完IDL文件后,我们可以使用Thrift提供的编译器将其编译成对应的语言代码。以Java为例,执行以下命令将IDL文件编译为Java代码:
thrift --gen java example.thrift
以上命令会生成一个Java包含了服务接口和方法的代码。
接下来,我们定义一个服务端类ExampleServer,实现ExampleService接口:
package com.example.server;
import com.example.thrift.ExampleService;
import org.apache.thrift.TException;
public class ExampleServer implements ExampleService.Iface {
@Override
public String helloWorld() throws TException {
return "Hello, World!";
}
}
在服务端代码中,我们实现了helloWorld方法,该方法返回一个字符串 "Hello, World!"。
然后,我们编写一个客户端类ExampleClient,用于向服务端发起请求:
package com.example.client;
import com.example.thrift.ExampleService;
import com.example.thrift.ServiceClientFactory;
import org.apache.thrift.TException;
public class ExampleClient {
public static void main(String[] args) {
try {
ExampleService.Client client = ServiceClientFactory.createClient();
String result = client.unknownMethod();
System.out.println(result);
} catch (TException e) {
System.out.println("Thrift.TApplicationExceptionUNKNOWN_METHOD: Unknown method name");
}
}
}
在客户端代码中,我们使用ServiceClientFactory.createClient()方法创建了一个ExampleService.Client对象,并调用了unknownMethod方法。该方法并不存在于服务端定义的接口中,会触发服务端抛出Thrift.TApplicationExceptionUNKNOWN_METHOD异常。在客户端中,我们捕获了这个异常,并打印出异常信息。
最后,我们需要实例化ExampleServer和ExampleClient类,并启动服务端和客户端来进行通信。这里使用Thrift提供的TThreadPoolServer和TThreadedSelectorServer作为服务端的实现。
package com.example;
import com.example.server.ExampleServer;
import org.apache.thrift.server.TThreadedSelectorServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.server.TThreadedSelectorServer.Args;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
public class App {
public static void main(String[] args) {
startServer();
startClient();
}
public static void startServer() {
try {
ExampleServer handler = new ExampleServer();
ExampleService.Processor<ExampleServer> processor = new ExampleService.Processor<>(handler);
TServerSocket serverTransport = new TServerSocket(9090);
// TThreadPoolServer
TThreadPoolServer.Args threadPoolArgs = new TThreadPoolServer.Args(serverTransport);
threadPoolArgs.processor(processor);
TThreadPoolServer server = new TThreadPoolServer(threadPoolArgs);
server.serve();
// TThreadedSelectorServer
// Args selectorArgs = new Args(serverTransport);
// selectorArgs.processor(processor);
// selectorArgs.selectorThreads(4);
// TThreadedSelectorServer selectorServer = new TThreadedSelectorServer(selectorArgs);
// selectorServer.serve();
} catch (TTransportException e) {
e.printStackTrace();
}
}
public static void startClient() {
ExampleClient.main(new String[]{});
}
}
在上述代码中,我们分别启动了服务端和客户端,通过线程池模式的TThreadPoolServer启动服务端。在startClient方法中调用了ExampleClient的main方法来启动客户端。
当我们运行App类时,服务端首先启动并监听9090端口,然后客户端发起请求调用unknownMethod方法,由于服务端没有定义该方法,会抛出Thrift.TApplicationExceptionUNKNOWN_METHOD异常,客户端捕获该异常并打印出异常信息。
以上就是使用Thrift.TApplicationExceptionUNKNOWN_METHOD异常的一个简单示例。
