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();
}
}