当前位置: 首页 > news >正文

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: {}"…...

查看目录或文件的磁盘使用情况

在排查问题过程中&#xff0c;会遇到磁盘占满&#xff0c;需要排查具体哪个文件占用比较大&#xff0c;此时可以使用du 命令 du [选项] [文件或目录...] 常用的选项包括&#xff1a; -h 或 --human-readable&#xff1a;以人类可读的格式&#xff08;如 K、M、G&#xff09;…...

如何选择合适的自动化框架

自动化测试框架的选型是一个复杂且重要的过程&#xff0c;需要考虑多个因素以确保所选框架能够满足项目的需求。以下是一些建议的步骤和考虑因素&#xff1a; 1. 明确项目需求&#xff1a; * 首先&#xff0c;要明确项目的测试需求&#xff0c;包括测试的类型&#xff08;如…...

Java面试进阶指南:高级知识点问答精粹(二)

Java 面试问题及答案 1. 什么是Java内存模型&#xff08;JMM&#xff09;&#xff1f;它在并发编程中扮演什么角色&#xff1f; 答案&#xff1a; Java内存模型&#xff08;JMM&#xff09;是一个抽象的模型&#xff0c;它定义了Java程序中各种变量&#xff08;线程共享变量&…...

thinkphp 使用模型实现多表连接查询

解决问题&#xff0c;多张表的查询连接问题&#xff0c;3张表及以上 爷爷表 有字段id 爸爸表 有字段id&#xff0c;grandfather_id 儿子表 id,parent_id 控制器中编写 public function getdata(){ $data model(爷爷表)->with([father.son])->select(); var_dump($data…...

LeetCode674:最长连续递增序列

题目描述 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定&#xff0c;如果对于每个 l < i < r&#xff0c;都有 nums[i] < nums…...

Java技术精粹:高级面试问题与解答指南(一)

Java 面试问题及答案 问题1&#xff1a;请解释Java中的多态性&#xff0c;并给出一个例子。 答案&#xff1a; 多态性是Java中的一个重要特性&#xff0c;它允许一个引用类型可以指向多种实际类型的对象&#xff0c;并且可以通过这个引用调用实际对象的方法。多态性主要通过继…...

数据可视化技术头歌测试合集

努力是为了不平庸~ 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰 目录 时间趋势可视化-柱形图 第1关&#xff1a;“大胃王”比赛数据柱形图绘制——绘制柱形图的基本步骤 任务描述 相关知识 观察和处理数据 绘…...

【linux-IMX6ULL-字符设备驱动简单框架实验】

目录 1. 字符设备驱动简介1.1 重要函数1.2 简单框架代码流程1.3 linux中关于驱动的重要命令 2. 字符设备驱动简单框架编写2.1 添加LICENSE信息2.2 驱动模块的入口与出口2.3 入口和出口函数的编写2.4 设备操作结构体定义2.4.1 结构体函数内容填充 3. 应用程序简介&#xff1a;4.…...

3D模型旋转显示不全怎么办---模大狮模型网

在3D建模和渲染过程中&#xff0c;我们有时会遇到旋转模型时显示不全的问题。这种情况可能由多种原因造成&#xff0c;包括模型本身的问题、软件设置不当、硬件配置不足等。本文将为您详细介绍几种可能的解决方法&#xff0c;帮助您解决3D模型旋转显示不全的问题。 一、检查模型…...

DLRover:蚂蚁集团开源的AI训练革命

在当前的深度学习领域&#xff0c;大规模训练作业面临着一系列挑战。首先&#xff0c;硬件故障或软件错误导致的停机时间会严重影响训练效率和进度。其次&#xff0c;传统的检查点机制在大规模训练中效率低下&#xff0c;耗时长且容易降低训练的有效时间。资源管理的复杂性也给…...

ubuntu_概念

su(switch user) wget(Web Get) cd(change directory) dpkg(Debian Packager)为 “Debian” 专门开发的套件管理系统&#xff0c;方便软件的安装、更新及移除。 chmod(Change Mode)用于改变文件或目录的权限 ps(Process Status)进程状态 grep(Global Regular Expression Print)…...

Oracle递归查询笔记

目录 一、创建表结构和插入数据 二、查询所有子节点 三、查询所有父节点 四、查询指定节点的根节点 五、查询指定节点的递归路径 六、递归子类 七、递归父类 一、创建表结构和插入数据 CREATE TABLE "REGION" ( "ID" VARCHAR2(36) DEFAULT SYS_GUI…...

FaceFusion源码框架解读

FaceFusion源码框架解读 我的视频讲解&#xff1a;FaceFusion入门教学 FaceFusion官网 FaceFusion是一款开源的AI换脸工具&#xff0c;一款非常好用的换脸工具&#xff0c;操作简单&#xff0c;上手容易。 Facefusion&#xff1a;GitHub - facefusion/facefusion: Next gene…...

React项目知识积累(三)

1.primary-color 公共样式 less文件中的primary-color&#xff0c;会在config.js中的theme中统一写,方便统一更改。 config.js: theme{"primary-color":"#f0f0f0"&#xff0c;"font-size":"16px", }less: .classname{color:primary-…...

前端实现打印功能

1、引入打印相关的库 在您的Vue项目中,需要先安装一个用于打印的库,如print-js。您可以通过以下命令安装&#xff1a; npm install print-js --save2、在组件中引入并使用&#xff0c;在需要实现打印功能的组件中&#xff0c;先import print-js模块&#xff1a; import print…...

创建型模式之工厂模式

文章目录 概述1.简单工厂概念结构图 2.工厂方法概念结构图 3.抽象工厂概念结构图 小结 概述 工厂模式用来创建不同但是相关类型的对象&#xff08;继承同一父类或者接口的一组子类&#xff09;&#xff0c;由给定的参数来决定创建哪种类型的对象。 其实&#xff0c;工厂还可以…...

「动态规划」按摩师

力扣原题链接&#xff0c;点击跳转。 一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在每次预约服务之间要有休息时间&#xff0c;因此她不能接受相邻的预约。给定一个预约请求序列nums&#xff0c;总共有n个预约&#xff0c;替按摩师找到…...

小程序-滚动触底-页面列表数据无限加载

// index/index.vue <template> <!-- 自定义导航栏 --> <CustomNavbar /> <scroll-view scrolltolower"onScrolltolower" scroll-y class"scroll-view"> <!-- 猜你喜欢 --> <Guess ref"guessRef" /> </s…...

监控上网的软件有哪些?含泪推荐的电脑监控软件

监控上网的软件有很多&#xff0c;企业选择的时候应该遵循什么样的原则呢&#xff1f;鄙人愚见&#xff0c;认为以下四项原则是选择监控软件时首要考虑的。 1、功能需求&#xff1a; 监控软件不应该只是起到控制上网的作用&#xff0c;因为一些泄密行为可能是通过USB接口、打印…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...