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

随机推荐

  1. CocoaPods常用的命令行以及安装方法

    1.新建一个Xcode工程,使用终端cd到工程目录下 2.创建Podfile文件 pod init ,之后就可以在项目目录里看到一个Podfile文件 3.打开Podfile文件:open Podfi ...

  2. js中判断数据类型的方法有哪些

    判断数据类型可以使用 typeof 但是typeof 判断数组和函数时返回的都是Object 不能具体判断,这时使用 instanceof 可以判断对象是否是另一个函数创造的 : 用法: typeof ...

  3. 微积分 Calculus

    前言 如果你的工作中没有用到微积分,毫无疑问,你的工作是简单而枯燥的. 0 limit Say there is a function \(f(x) = x\). \(x \rightarrow a\ ...

  4. API和SDK的区别

    API 和 SDK 有以下区别: 定义与功能: API(应用程序编程接口):是一组定义了软件组件之间交互规范的接口,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而无需访问源码或 ...

  5. 五分钟掌握Python中配置文件解析器configparser的使用

    ---  好的方法很多,我们先掌握一种  --- [背景] 这里描述的配置文件为自动化用例中使用到的信息,非pytest自动化框架中例如pytest.ini, conftest.py等具有特殊意义的配 ...

  6. Next.js 与 React 全栈开发:整合 TypeScript、Redux 和 Ant Design

    在上一集,我们编写完毕导航页面,并且非常的美观,但是我们发现编写网站是存静态的,在现代的网站当中一般都是动静结合,也就是说部分数据是从数据库读取的,部分静态数据是写在网页上面的,因此这章讲述如何搭建一 ...

  7. composer 基础操作

    一.composer入门 1.每次安装新的包文件,会更新/vendor/autoload.php文件 2.composer.lock与composer.json的关系 文件composer.lock会 ...

  8. Postman 免登录测试后端接口

    今天跟测试同学学习了下用Postman免登录测试后端接口,测试同学除了会对我们系统前端测试外,一些后端接口涉及危险操作也会使用Postman 对接口进行测试,这个时候就需要解决一个接口免登录的问题,他 ...

  9. Reviewbot 开源 | 为什么我们要打造自己的代码审查服务?

    Reviewbot 是七牛云开源的一个项目,旨在提供一个自托管的代码审查服务, 方便做 code review/静态检查, 以及自定义工程规范的落地. 静态检查不是个新鲜事. 我记得早在几年前,我们就 ...

  10. Zipkin+Sleuth调用链监控集成和使用

    背景与需求 跨微服务的API调用发生异常,要求快速定位出问题出在哪里. 跨微服务的API调用发生性能瓶颈,要求迅速定位出性能瓶颈. 集成 整体结构 整体机构为C/S模式,客户端(Sleuth)来监控采 ...