ScheduleServerRunnable2

 

 

package com.xx.schedule.thrift.server;

import com.xx.schedule.thrift.service.ScheduleService;
import lombok.extern.slf4j.Slf4j;
import org.apache.thrift.TMultiplexedProcessor;
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocolFactory;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;

/**
 * @version 1.0.0
 * @author xx.cn
 * @date 2020-09-27 14:21
 */
@Slf4j
public class ScheduleServerRunnable2 implements Runnable{
    private int port;
    private ScheduleService.Iface scheduleService;
    private TServer server;

    private static final int THRIFT_TIMEOUT = 5000;
    private static final int THRIFT_TCP_BACKLOG = 5000;
    private static final int THRIFT_CORE_THREADS = Runtime.getRuntime().availableProcessors();
    private static final int THRIFT_MAX_THREADS = 2 * Runtime.getRuntime().availableProcessors();
    private static final int THRIFT_SELECTOR_THREADS = 16;
    private static final TProtocolFactory THRIFT_PROTOCOL_FACTORY = new TBinaryProtocol.Factory();
    // 16MB
    private static final int THRIFT_MAX_FRAME_SIZE = 16 * 1024 * 1024;
    // 4MB
    private static final int THRIFT_MAX_READ_BUF_SIZE = 4 * 1024 * 1024;

    public ScheduleServerRunnable2(int port, ScheduleService.Iface scheduleService) {
        this.port = port;
        this.scheduleService = scheduleService;
    }

    @Override
    public void run() {
        try {
            log.info("start server");
            buildServer().serve();
        } catch (Exception e) {
            log.error("start server error", e);
        }
    }

    public void stop(){
        log.info("stop server");
        server.stop();
    }

    private TServer buildServer() throws TTransportException {
        TNonblockingServerSocket.NonblockingAbstractServerSocketArgs socketArgs = new TNonblockingServerSocket.NonblockingAbstractServerSocketArgs()
                .port(port)
                .clientTimeout(THRIFT_TIMEOUT)
                .backlog(THRIFT_TCP_BACKLOG);

        try (TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(socketArgs)){
            TProcessor processor = new ScheduleService.Processor<ScheduleService.Iface>(scheduleService);

            TMultiplexedProcessor multiplexedProcessor = new TMultiplexedProcessor();
            multiplexedProcessor.registerProcessor("scheduleService", processor);

            // 使用非阻塞式IO,服务端和客户端需要指定TFramedTransport数据传输的方式
            THsHaServer.Args args = new THsHaServer.Args(serverTransport)
                    .transportFactory(new TFramedTransport.Factory(THRIFT_MAX_FRAME_SIZE))
//                    .inputProtocolFactory(THRIFT_PROTOCOL_FACTORY)
//                    .outputProtocolFactory(THRIFT_PROTOCOL_FACTORY)
                    .protocolFactory(THRIFT_PROTOCOL_FACTORY)
                    .processor(multiplexedProcessor);

            args.maxReadBufferBytes = THRIFT_MAX_READ_BUF_SIZE;

            server = new THsHaServer(args);
        }
        return server;
    }
}

 

/*
        TProcessor tprocessor = new ScheduleService.Processor<ScheduleService.Iface>(scheduleService);
        TNonblockingServerSocket tnbSocketTransport = new TNonblockingServerSocket(port);
        THsHaServer.Args tArgs = new THsHaServer.Args(tnbSocketTransport);
        tArgs.processor(tprocessor);
        tArgs.transportFactory(new TFramedTransport.Factory());
        tArgs.protocolFactory(new TBinaryProtocol.Factory());
        //半同步半异步的服务模型
        TServer server = new THsHaServer(tArgs);
        */

 

 

package com.xx.schedule.client;

import com.xx.schedule.thrift.model.PpcResponse;
import com.xx.schedule.thrift.service.ScheduleService;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;

/**
 * @version 1.0.0
 * @author xx.cn
 * @date 2020-09-25 14:02
 */
@Slf4j
public class ScheduleClientDemo2 {
    public static final String SERVER_IP = "192.168.1.18";
    public static final int SERVER_PORT = 7777;
    public static final int TIMEOUT = 30000;

    public void startClient() {
        try(TTransport transport = new TFramedTransport(new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT))){
            TProtocol protocol = new TBinaryProtocol(transport);
            ScheduleService.Client client = new ScheduleService.Client(protocol);
            transport.open();
            client.receive(new PpcResponse().setUuid("uuid").setResult(Lists.newArrayList("world")));
        } catch(Exception ex){
            log.error("startClient error", ex);
        }
    }

    public static void main(String[] args) {
        ScheduleClientDemo2 client = new ScheduleClientDemo2();
        client.startClient();
    }
}

 

posted @ 2020-09-30 16:24  牧之丨  阅读(242)  评论(0编辑  收藏  举报