关于java:thrift-学习入门笔记

49次阅读

共计 3330 个字符,预计需要花费 9 分钟才能阅读完成。

thrift 学习入门笔记

参考连贯:Thrift 入门

装置 thrift 命令:

brew install thrift

引入 maven 依赖

        <!-- https://mvnrepository.com/artifact/org.apache.thrift/libthrift -->
        <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libthrift</artifactId>
            <version>0.16.0</version>
        </dependency>

编写 thrift 文件

namespace java thrift.generated

typedef i16 short
typedef i32 int
typedef i64 long
typedef string String

struct Person{
    1:optional String username,
    2:optional int age,
    3:optional bool married
}

exception DataException{
    1:optional String message,
    2:optional String callStack,
    3:optional String code
}

service PersonService{Person getPersonByName(1:required String name) throws (1:DataException e);

    void savePerson(1:required Person p) throws(1:DataException e);
}

生成代码

thrift --gen java ./resources/data.thrift 

<!-- 而后会在我的项目中生成的 gen-java 文件夹下生成 java 文件 -->

├── gen-java
│   └── thrift
│       └── generated
│           ├── DataException.java
│           ├── Person.java
│           └── PersonService.java

新建 PersonServiceImpl 实现 PersonService 接口。


public class PersonServiceImpl implements PersonService.Iface {
    @Override
    public Person getPersonByName(String name) throws DataException, TException {System.out.println("----->> getPersonByName <<-------");

        Person p1 = new Person();
        p1.setAge(23);
        p1.setMarried(Boolean.TRUE);
        p1.setUsername("zhang san");
        return p1;
    }

    @Override
    public void savePerson(Person p) throws DataException, TException {System.out.println("---- savePerson -----");

        System.out.println(p.getAge());
        System.out.println(p.getUsername());
        System.out.println(p.isMarried());
    }
}

编写服务端


import com.demo.thrift.PersonService;
import com.demo.thrift.PersonServiceImpl;
import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.layered.TFramedTransport;

public class MyServer {public static void main(String[] args) throws Exception{TNonblockingServerSocket socket = new TNonblockingServerSocket(8899);

        THsHaServer.Args args1 = new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4);

        PersonService.Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl());

        args1.protocolFactory(new TCompactProtocol.Factory());
        args1.transportFactory(new TFramedTransport.Factory());
        args1.processorFactory(new TProcessorFactory(processor));

        THsHaServer tHsHaServer = new THsHaServer(args1);
        
        System.out.println("服务端已启动:8899");
        tHsHaServer.serve();}
}

编写客户端


import com.demo.thrift.Person;
import com.demo.thrift.PersonService;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
import org.apache.thrift.transport.layered.TFramedTransport;

public class MyClient {public static void main(String[] args) throws TTransportException {TTransport transport = new TFramedTransport(new TSocket("localhost", 8899), 600);

        TProtocol protocol = new TCompactProtocol(transport);

        PersonService.Client client = new PersonService.Client(protocol);

        try {transport.open();
            Person zhang_san = client.getPersonByName("zhang san");
            System.out.println(zhang_san.getAge());
            System.out.println(zhang_san.getUsername());
            System.out.println(zhang_san.isMarried());

            Person p1 = new Person();
            p1.setAge(21);
            p1.setMarried(Boolean.FALSE);
            p1.setUsername("lisi");

            client.savePerson(p1);
        }catch (Exception e){e.printStackTrace();
        }finally {transport.close();
        }
    }
}

over

正文完
 0