netty-socketio 集群随记
实现netty-socketio集群的方式
代码实例
@PostConstructpublic void subscribe() {pubSubStore.subscribe(PubSubType.DISPATCH, new PubSubListener<DispatchMessage>() {@Overridepublic void onMessage(DispatchMessage message) {log.debug("subscribe: {}" ,message);Collection<SocketIOClient> clients = null;String room = message.getRoom();String namespace = message.getNamespace();Packet packet = message.getPacket();if (!ObjectUtils.isEmpty(namespace)&&!ObjectUtils.isEmpty(room)){SocketIONamespace socketIONamespace = socketIOServer.getNamespace(namespace);if (socketIONamespace != null){clients = socketIONamespace.getRoomOperations(room).getClients();}}else{clients = socketIOServer.getBroadcastOperations().getClients();}if(!CollectionUtils.isEmpty(clients)){clients.parallelStream().forEach(ioClient -> {ioClient.sendEvent(Event.Event,packet.getData());});}}}, DispatchMessage.class);}
}
@Component
@Slf4j
public class ClientUtil {@Resourceprivate SocketIOServer socketIOServer;public void sendEvent(SocketIOClient client, MessageModel model) {log.debug("sendEvent--------------------------:{}", model);client.sendEvent(Event.Event, model);}public void sendNamespaceRoomEventExcluded(SocketIOClient client, MessageModel model) {log.debug("sendNamespaceRoomEventExcluded:{}", model);socketIOServer.getNamespace(model.getNamespace()).getRoomOperations(model.getRoomId()).sendEvent(Event.Event, client, model);}public void sendNamespaceRoomEvent(MessageModel model) {log.debug("sendNamespaceRoomEvent:{}", model);socketIOServer.getNamespace(model.getNamespace()).getRoomOperations(model.getRoomId()).sendEvent(Event.Event, model);}public void sendNamespaceEvent(MessageModel model) {log.debug("sendNamespaceRoomEvent:{}", model);socketIOServer.getNamespace(model.getNamespace()).getAllClients().parallelStream().forEach(client -> {client.sendEvent(Event.Event, model);});}public void sendRoomEvent(MessageModel model) {log.debug("sendNamespaceRoomEvent:{}", model);socketIOServer.getRoomOperations(model.getRoomId()).sendEvent(Event.Event, model);}
}
源码
查看源码可发现sendEvent方法最终还是调用了dispatch方法,由此可见我们只需要实现订阅就行。
/*** broadcast interface**/
public interface BroadcastOperations extends ClientOperations {Collection<SocketIOClient> getClients();<T> void send(Packet packet, BroadcastAckCallback<T> ackCallback);void sendEvent(String name, SocketIOClient excludedClient, Object... data);void sendEvent(String name, Predicate<SocketIOClient> excludePredicate, Object... data);<T> void sendEvent(String name, Object data, BroadcastAckCallback<T> ackCallback);<T> void sendEvent(String name, Object data, SocketIOClient excludedClient, BroadcastAckCallback<T> ackCallback);<T> void sendEvent(String name, Object data, Predicate<SocketIOClient> excludePredicate, BroadcastAckCallback<T> ackCallback);}
@Overridepublic void sendEvent(String name, Predicate<SocketIOClient> excludePredicate, Object... data) {Packet packet = new Packet(PacketType.MESSAGE, EngineIOVersion.UNKNOWN);packet.setSubType(PacketType.EVENT);packet.setName(name);packet.setData(Arrays.asList(data));for (SocketIOClient client : clients) {packet.setEngineIOVersion(client.getEngineIOVersion());if (excludePredicate.test(client)) {continue;}client.send(packet);}dispatch(packet);}
private void dispatch(Packet packet) {this.storeFactory.pubSubStore().publish(PubSubType.DISPATCH,new DispatchMessage(this.room, packet, this.namespace));}
相关文章:
netty-socketio 集群随记
实现netty-socketio集群的方式 代码实例 PostConstructpublic void subscribe() {pubSubStore.subscribe(PubSubType.DISPATCH, new PubSubListener<DispatchMessage>() {Overridepublic void onMessage(DispatchMessage message) {log.debug("subscribe: {}"…...
查看目录或文件的磁盘使用情况
在排查问题过程中,会遇到磁盘占满,需要排查具体哪个文件占用比较大,此时可以使用du 命令 du [选项] [文件或目录...] 常用的选项包括: -h 或 --human-readable:以人类可读的格式(如 K、M、G)…...
如何选择合适的自动化框架
自动化测试框架的选型是一个复杂且重要的过程,需要考虑多个因素以确保所选框架能够满足项目的需求。以下是一些建议的步骤和考虑因素: 1. 明确项目需求: * 首先,要明确项目的测试需求,包括测试的类型(如…...
Java面试进阶指南:高级知识点问答精粹(二)
Java 面试问题及答案 1. 什么是Java内存模型(JMM)?它在并发编程中扮演什么角色? 答案: Java内存模型(JMM)是一个抽象的模型,它定义了Java程序中各种变量(线程共享变量&…...
thinkphp 使用模型实现多表连接查询
解决问题,多张表的查询连接问题,3张表及以上 爷爷表 有字段id 爸爸表 有字段id,grandfather_id 儿子表 id,parent_id 控制器中编写 public function getdata(){ $data model(爷爷表)->with([father.son])->select(); var_dump($data…...
LeetCode674:最长连续递增序列
题目描述 给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l < i < r,都有 nums[i] < nums…...
Java技术精粹:高级面试问题与解答指南(一)
Java 面试问题及答案 问题1:请解释Java中的多态性,并给出一个例子。 答案: 多态性是Java中的一个重要特性,它允许一个引用类型可以指向多种实际类型的对象,并且可以通过这个引用调用实际对象的方法。多态性主要通过继…...
数据可视化技术头歌测试合集
努力是为了不平庸~ 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰 目录 时间趋势可视化-柱形图 第1关:“大胃王”比赛数据柱形图绘制——绘制柱形图的基本步骤 任务描述 相关知识 观察和处理数据 绘…...
【linux-IMX6ULL-字符设备驱动简单框架实验】
目录 1. 字符设备驱动简介1.1 重要函数1.2 简单框架代码流程1.3 linux中关于驱动的重要命令 2. 字符设备驱动简单框架编写2.1 添加LICENSE信息2.2 驱动模块的入口与出口2.3 入口和出口函数的编写2.4 设备操作结构体定义2.4.1 结构体函数内容填充 3. 应用程序简介:4.…...
3D模型旋转显示不全怎么办---模大狮模型网
在3D建模和渲染过程中,我们有时会遇到旋转模型时显示不全的问题。这种情况可能由多种原因造成,包括模型本身的问题、软件设置不当、硬件配置不足等。本文将为您详细介绍几种可能的解决方法,帮助您解决3D模型旋转显示不全的问题。 一、检查模型…...
DLRover:蚂蚁集团开源的AI训练革命
在当前的深度学习领域,大规模训练作业面临着一系列挑战。首先,硬件故障或软件错误导致的停机时间会严重影响训练效率和进度。其次,传统的检查点机制在大规模训练中效率低下,耗时长且容易降低训练的有效时间。资源管理的复杂性也给…...
ubuntu_概念
su(switch user) wget(Web Get) cd(change directory) dpkg(Debian Packager)为 “Debian” 专门开发的套件管理系统,方便软件的安装、更新及移除。 chmod(Change Mode)用于改变文件或目录的权限 ps(Process Status)进程状态 grep(Global Regular Expression Print)…...
Oracle递归查询笔记
目录 一、创建表结构和插入数据 二、查询所有子节点 三、查询所有父节点 四、查询指定节点的根节点 五、查询指定节点的递归路径 六、递归子类 七、递归父类 一、创建表结构和插入数据 CREATE TABLE "REGION" ( "ID" VARCHAR2(36) DEFAULT SYS_GUI…...
FaceFusion源码框架解读
FaceFusion源码框架解读 我的视频讲解:FaceFusion入门教学 FaceFusion官网 FaceFusion是一款开源的AI换脸工具,一款非常好用的换脸工具,操作简单,上手容易。 Facefusion:GitHub - facefusion/facefusion: Next gene…...
React项目知识积累(三)
1.primary-color 公共样式 less文件中的primary-color,会在config.js中的theme中统一写,方便统一更改。 config.js: theme{"primary-color":"#f0f0f0","font-size":"16px", }less: .classname{color:primary-…...
前端实现打印功能
1、引入打印相关的库 在您的Vue项目中,需要先安装一个用于打印的库,如print-js。您可以通过以下命令安装: npm install print-js --save2、在组件中引入并使用,在需要实现打印功能的组件中,先import print-js模块: import print…...
创建型模式之工厂模式
文章目录 概述1.简单工厂概念结构图 2.工厂方法概念结构图 3.抽象工厂概念结构图 小结 概述 工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。 其实,工厂还可以…...
「动态规划」按摩师
力扣原题链接,点击跳转。 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列nums,总共有n个预约,替按摩师找到…...
小程序-滚动触底-页面列表数据无限加载
// index/index.vue <template> <!-- 自定义导航栏 --> <CustomNavbar /> <scroll-view scrolltolower"onScrolltolower" scroll-y class"scroll-view"> <!-- 猜你喜欢 --> <Guess ref"guessRef" /> </s…...
监控上网的软件有哪些?含泪推荐的电脑监控软件
监控上网的软件有很多,企业选择的时候应该遵循什么样的原则呢?鄙人愚见,认为以下四项原则是选择监控软件时首要考虑的。 1、功能需求: 监控软件不应该只是起到控制上网的作用,因为一些泄密行为可能是通过USB接口、打印…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
