首页 > 其他分享 >即时通讯 离线消息处理初版

即时通讯 离线消息处理初版

时间:2024-10-22 20:45:25浏览次数:3  
标签:receiverName 离线 即时通讯 notOnlineReceiverSet import message 初版 redisTemplate

离线消息处理

NotOnlineExecute

package com.example.im.infra.executor.send;

import com.example.im.endpoint.WebSocketEndpoint;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Set;

/**
 * @author PC
 * 不在线处理方式
 */
@Component
public class NotOnlineExecute {

    private final static Logger logger = LoggerFactory.getLogger(NotOnlineExecute.class);

    private RedisTemplate<String, String> redisTemplate;

    @Autowired
    public void setRedisTemplate(RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    /**
     * 用户不在线时保存离线消息
     *
     * @param notOnlineReceiverSet 不在线人员列表
     * @param message              消息
     */
    public void notOnlineMessageSave(Set<String> notOnlineReceiverSet, String message) {
        //离线消息
        notOnlineReceiverSet.forEach(receiver -> redisTemplate.opsForSet().add("offline_messages:" + receiver, message));
    }

    /**
     * 用户上线时进行发送
     *
     * @param receiverName 接收人
     */
    public void sendOnline(String receiverName) {
        int receiverNameHashCode = receiverName.hashCode();
        Set<String> messageSet = redisTemplate.opsForSet().members("offline_messages:" + receiverName);
        if (CollectionUtils.isEmpty(messageSet)) {
            logger.info(receiverName + "no offline messages");
            return;
        }
        messageSet.forEach(message -> {
            try {
                WebSocketEndpoint.WEB_SOCKET_ENDPOINT_MAP.get(receiverNameHashCode).getSession().getBasicRemote()
                        .sendText(message);
            } catch (IOException e) {
                logger.error("An error occurred when the user: {} received an offline message: {}", receiverName, message);
            }
        });
        redisTemplate.delete("offline_messages:" + receiverName);
    }
}

com.example.im.infra.executor.send.DefaultSendExecutor#sendToUser

向redis添加未送达消息

notOnlineReceiverSet = notOnlineReceiverSet.stream().filter(StringUtils::isNotEmpty).collect(Collectors.toSet());
if (CollectionUtils.isNotEmpty(notOnlineReceiverSet)) {
    //处理未送达消息
    notOnlineExecute.notOnlineMessageSave(notOnlineReceiverSet, generatorMessage(message));
    logger.info("not online number is " + notOnlineReceiverSet.size());
    logger.info("The user : {} is not online", String.join(",", notOnlineReceiverSet));
}

com.example.im.endpoint.WebSocketEndpoint#onOpen

用户登录时触发离线消息发送

WEB_SOCKET_ENDPOINT_MAP.put(hashCode, this);
//触发离线消息发送
notOnlineExecute.sendOnline(userName);

测试

test2向test1发送消息,test1不进行连接

test1连接,接收到离线消息

参考资料

[1].处理离线消息代码

标签:receiverName,离线,即时通讯,notOnlineReceiverSet,import,message,初版,redisTemplate
From: https://blog.csdn.net/weixin_43625238/article/details/143168160

相关文章

  • 即时通讯:消息如何保证有序?
    1.消息如何保证有序?参考:http://www.52im.net/thread-714-1-1.html消息有序即发送的顺序和收到的顺序一致消息头字段内容包括:发送方id,接收方id,消息msg_id,消息类型,创建时间,大小等messageIMMsgData{ cmdid:0x0301//消息数据指令ID uint32from_user_id=1;......
  • qwen2.5 ollama推理;openai function call调用中文离线agents使用
    ollama部署qwen2.5:3b0.3.11版本agents使用https://qwen.readthedocs.io/en/latest/framework/function_call.htmlfromopenaiimportOpenAIimportjsondefsend_messages(messages):response=client.chat.completions.create(model="qwen2.5:3b......
  • GhostDoc Enterprise.v2024.1.24160 for Visual Studio 2022插件漏洞分析和离线解锁方
      先安装,然后直接使用dnspy调试VisualStudio2022,以GhostdocPro的注册对话框作为突破口进行调试。经过一些调试可以比较轻松的发现关键点在SubMain.GhostDoc.Services.clr4.dll中,你可以通过everything在vs的插件目录中找到这个dll所在位置,其它版本的VisualStudio的方法是类似......
  • ARM架构鲲鹏主机BClinux离线安装docker步骤
    ■下载arm架构二进制文件安装包http://mirrors.163.com/docker-ce/linux/static/stable/aarch64/docker-27.3.1.tgz21-Sep-202401:3666M■解压二进制文件移动到/usr/bin目录tarxvfzdocker-27.3.1.tgzls-ldockercpdocker/......
  • CDR2024最新25.2.2.313官方离线特别版下载+永久注册机
    CorelDRAW(简称CDR)是一款专业的图形设计软件。该软件是加拿大Corel公司开发的一款功能强大的专业平面设计软件、矢量设计软件、矢量绘图软件。这款矢量图形制作工具软件广泛应用于商标设计、标志制作、封面设计、CIS设计、产品包装造型设计、模型绘制、插图描画、时装/服饰设计......
  • 汉化AI换脸神器可离线完全免费
    今天给大家带来两款免费的AI换脸软件。软件介绍01第一款“AIFaceSwap”,是一款完全免费的国外神器,我在这里给大家带来的是便携版,其大小有3.38G,解压以后大小为7.62G,这存储小的小伙伴是真伤不起啊!不过它是真好用,打开软件,其功能非常简单,选择替换人脸的图片,再选择目标人脸,点击......
  • centos离线安装docker,docker-compose
    安装环境操作系统:Centos7.99内核版本:3.10.0-1160.el7.x86_64安装用户:rootdocker离线安装1下载压缩包官网下载地址:https://download.docker.com/linux/static/stable/x86_64/这里默认选择最新版本(26.0.2)。2上传压缩包并解压tarzxvfdocker-26.0.2.tgz3......
  • 密码管理APP系统规格说明书(初版)
    这里写目录标题1引言1.1背景1.2目的1.3范围2系统需求2.1功能需求2.2性能需求2.3安全需求2.4兼容性需求3系统设计3.1总体架构3.1.1系统架构概述3.1.2技术选型3.2功能模块设计3.2.1密码生成模块3.2.2安全存储模块3.2.3自动填充模块3.2.4多平台支持模......
  • 国产麒麟操作系统离线一键升级openssh版本
       根据等保测评结果,一般服务器都需要升级openssh版本和openssl版本,由于2个不同软件之间版本相互有关联,分开下载不知道下载哪个版本才合适,经过本人亲测,在一台服务器跑通后,直接同时4台服务器操作,3分钟内把另外4台服务器的所有关于openssh漏洞的问题都解决了。下面是相应的执......
  • 配置supermap iportal数据库,银河麒麟arm架构SP3系统中离线编译安装postgres、postgis
     一、安装环境准备postgresql-11.2.tar.gz、postgis-2.5.0.tar.gz文件,geos-3.6.1-12.ky10.aarch64.rpm包,再准备一台有外网的机器。如果遇到缺少的包,去有外网的机器下载,再考到内网机器里安装。大部分安装都是编译安装,遵循配置、编译、安装这三步。注意安装后的软件目录postgre......