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();
}
}
随机推荐
- iOS 14 UIDatePicker适配问题,使用老的选择器样式
iOS 14 UIDatePicker 在 13.4 新增了2个属性如下 @property (nonatomic, readwrite, assign) UIDatePickerStyle pref ...
- element的图片上传预处理函数
/** 图片格式和大小的控制 */ beforeAvatarUpload (file) { // 允许上传 jpg 和 png 格式的图片 const isJPG = file.type === &q ...
- 09 什么是注意力机制(Attention )
博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...
- 007 Python、Anaconda、pip、Pycharm、Jupyter都是啥?
博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...
- Android复习(三)清单文件中的元素——>application
<application> 语法: <application android:allowTaskReparenting=["true" | "false ...
- 动态避障-图扑自动寻路 3D 可视化
自动寻路是机器人导航的核心技术,其原理主要涉及机器人与环境之间的复杂信息交互与处理.在自动寻路过程中,机器人依靠先进的传感器系统,如高清摄像头.精密激光雷达和灵敏超声波装置,全方位感知周围环境.这些传 ...
- 13-1 c++拷贝控制:拷贝赋值与销毁
定义一个类时,我们必须对它进行拷贝控制,即控制该类在进行拷贝.赋值.移动和销毁时要进行哪些操作 一个类通过五个特殊的成员函数进行拷贝控制 拷贝构造函数 拷贝赋值函数 移动构造函数 移动赋值函数 析构函 ...
- C# 请求 form-data格式的 接口 POSTMAN form-data
HttpClient _httpClient = new HttpClient(); var postContent = new MultipartFormDataContent(); string ...
- 探索 USB 上网模组,Air780ER 当仁不让
今天探索的是USB上网模组,我推荐的是Air780ER模组,本文从用户实际使用的角度,解答大家对Air780ER最关心的一些问题,内容不深入探究技术细节,更多从选型.应用等非技术维度展开. 一.Air ...
- ARC133D Range XOR
ARC133D Range XOR 题目链接:[ARC133D] Range XOR 非常好数位 dp. 思路 根据异或的前缀和,我们可以把式子化成这样. \[\sum_{i=l}^r\sum_{j= ...