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. 2023年5月中国数据库排行榜:OTO组合回归育新机,华为高斯蓄势待发展雄心

    路漫漫其修远兮,吾将上下而求索. 2023年5月的 墨天轮中国数据库流行度排行 火热出炉,本月共有262个数据库参与排名.本月排行榜前十变动较大,可以用一句话概括为:openGauss 立足创新夺探花 ...

  2. 好文分享 | 记一次Oracle12c数据库SQL短暂缓慢问题分析

    本文为墨天轮社区作者 张sir 原创作品,记录了日常运维Oracle数据库过程中遇到的一个慢SQL问题的解决.优化过程,文章内容全面具体.分析到位,且含有经验总结,分享给各位. 问题现象 这次出问题的 ...

  3. 009 Pycharm的使用(各种骚操作和快捷键)

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  4. KubeSphere 最佳实战:Kubernetes 部署集群模式 Nacos 实战指南

    Nacos 是 Dynamic Naming and Configuration Service 的首字母简称,一个更易于构建云原生应用的动态服务发现.配置管理和服务管理平台. Nacos 是构建以服 ...

  5. vue 从后端拿到验证码并点击刷新

    验证码登录的实现思路1.前端从后端拿到验证码图片2.输入验证码进行登录3.后端拿到验证码进行比对,正确登录成功. 前端请求验证码直接写在img标签中即可,不必单独发送axios请求 // templa ...

  6. Python函数指定参数、返回值类型

    def fun(arg1: str, arg2: int ...) -> str: def as_view(name: str, *class_args: int, **class_kwargs ...

  7. 教程:搭建一个我的世界模组服务器(Linux)

    首先给自己的服务器打个广告 服务器版本1.12.2 地址:www.verysucksminecraftserver.top(好像只有一个月) 所需Mod网盘:https://pan.quark.cn/ ...

  8. pdf.js使用

    百度上很多例子,都是构建之前的! 我们使用pdf.js,最终只需要构建后的内容,大家可以通过这里进行下载: https://pan.baidu.com/s/14J-m-jeHdvn46cPhPXk54 ...

  9. 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit

    1.问题描述: 人脸活体检测页面会有声音提示,如何控制声音开关? 解决方案: 活体检测暂无声音控制开关,但可通过其他能力控制系统音量,从而控制音量. 活体检测页面固定音频流设置的是8(无障碍),获取的 ...

  10. 基于XAML框架和跨平台项目架构设计的深入技术分析

    XAML平台和跨平台开发策略 本文基于Vicky&James 2024年10月22日在韩国Microsoft总部BMW meetup会议上的演讲内容重新整理而成.这次研讨会我们深入探讨了基于X ...