thrift 0.9.3版本。
thrift文件可以自定义异常,在服务里声明。这样,服务端抛出异常,客户端才可以捕获,如果是未声明的,则客户端无法识别,就无法正确反序列化出返回的内容,导致协议层抛出异常。
model.thrift:
namespace java com.liyao.model
struct Person{
1: required string name;
2: optional i32 age;
}
exception MyException{
1: optional i32 code;
2: optional string msg;
}
hello.service:
namespace java com.liyao.service
include "model.thrift"
service HelloWorldService {
string sayHello(1: model.Person person) throws (1: model.MyException e)
}
使用thrift -r --gen java hello.thrift 编译。
实现类:
public class HelloWorldServiceImpl implements HelloWorldService.Iface {
@Override
public String sayHello(Person person) throws MyException, TException {
if (person.age < 10) {
MyException e = new MyException();
e.setCode(500);
e.setMsg("age too small");
throw e;
} else if (person.age > 100) {
throw new NullPointerException();
}
return "hello " + person.name;
}
}
服务端,使用simple模式:
public class HelloServerDemo {
public static void main(String args[]){
try {
System.out.println("服务端开启....");
TProcessor tprocessor = new HelloWorldService.Processor<HelloWorldService.Iface>(new HelloWorldServiceImpl());
TServerSocket serverTransport = new TServerSocket(50004);
TServer.Args tArgs = new TServer.Args(serverTransport);
tArgs.processor(tprocessor);
tArgs.protocolFactory(new TBinaryProtocol.Factory());
TServer server = new TSimpleServer(tArgs);
server.serve();
}catch (TTransportException e) {
e.printStackTrace();
}
// try {
// System.out.println("服务端开启....");
// TProcessor tprocessor = new HelloWorldService.Processor<HelloWorldService.Iface>(new HelloWorldServiceImpl());
// TNonblockingServerTransport serverSocket=new TNonblockingServerSocket(50004);
// TThreadedSelectorServer.Args tArgs = new TThreadedSelectorServer.Args(serverSocket);
// tArgs.processor(tprocessor);
// tArgs.protocolFactory(new TBinaryProtocol.Factory());
// TServer server = new TThreadedSelectorServer(tArgs);
// server.serve();
// }catch (TTransportException e) {
// e.printStackTrace();
// }
}
}
客户端:
public class Client {
public static void main(String[] args) {
System.out.println("客户端启动....");
TTransport transport = null;
try {
transport = new TSocket("localhost", 50004);
TProtocol protocol = new TBinaryProtocol(transport);
HelloWorldService.Client client = new HelloWorldService.Client(protocol);
transport.open();
Person p = new Person();
p.setName("ly");
p.setAge(400);
String result = client.sayHello(p);
System.out.println(result);
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
} finally {
if (null != transport) {
transport.close();
}
}
}
}
如果是NPE,则客户端:
客户端启动....
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
org.apache.thrift.transport.TTransportException: java.net.ConnectException: Connection refused: connect
at org.apache.thrift.transport.TSocket.open(TSocket.java:226)
at com.liyao.Client.main(Client.java:21)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at org.apache.thrift.transport.TSocket.open(TSocket.java:221)
... 1 more
Process finished with exit code 0