首页 > 其他分享 >使用RabbitMQ时使用MemoryPack序列化和反序列化对象

使用RabbitMQ时使用MemoryPack序列化和反序列化对象

时间:2023-11-29 23:35:36浏览次数:43  
标签:RabbitMQ MemoryPack connection var 序列化 public channel

  [MemoryPackable]
    public partial class UserEto
    {
        public String Name { get; set; }
    }

 

发送端

public class EventBus : IEventBus
{
    public void Publish(string exchangeName, object eventData)
    {
        using var connection = RabbitMQHelper.GetConnection();
        var channel = connection.CreateModel();

        // 序列化对象
         var message = MemoryPackSerializer.Serialize(eventData.GetType(),eventData);

        channel.BasicPublish(exchangeName, "", null,message);
    }
}

 

 

接收端

public class ConsumerBackgroundWorker : BackgroundService
    {
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
             var connection = RabbitMQHelper.GetConnection();

            var channel = connection.CreateModel();

            // 声明交换机
            channel.ExchangeDeclare("MyExchange", "direct");

            // 声明队列
            channel.QueueDeclare("QueueOne", false, false, false, null);

            // 绑定队列到交换机
            channel.QueueBind("QueueOne", "MyExchange", "");

            // 基于channel生成监听
            var consumer = new EventingBasicConsumer(channel);
            consumer.Received += (object? sender, BasicDeliverEventArgs e) =>
            {
               
               // 反序列化对象
                var obj =  MemoryPackSerializer.Deserialize<UserEto>(e.Body.Span);

                foreach (var handler in WebApplicationExtensions.EventHandlerList)
                {
                     ((IEventHandler)Activator.CreateInstance(handler)).HandleEvent(channel,  obj);
                }
            };

            channel.BasicConsume("QueueOne", true, consumer);
        }
    }

 

在反序列化时,RabbitMQ接收到的 BasicDeliverEventArgs 的 Body 类型为"System.ReadOnlyMemory<Byte>" ,常规使用Json序列化时只需要使用

Encoding.Default.GetString(e.Body.ToArray()); 即可,而在这里,要先将ReadOnlyMemory转换为ReadOnlySpan。

标签:RabbitMQ,MemoryPack,connection,var,序列化,public,channel
From: https://www.cnblogs.com/miwa441/p/17866185.html

相关文章

  • RabbitMQ消息队列
    一.什么是消息队列1.简介在介绍消息队列之前,应该先了解什么是AMQP(AdvancedMessageQueuingProtocol,高级消息队列协议,点击查看)消息(Message)是指在应用间传送的数据,消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象;而消息队列(MessageQueue)是一种应用间的......
  • php反序列化
    前置知识各种魔术方法的触发条件:__construct当一个对象创建时被调用,__destruct当一个对象销毁时被调用,当对象创建完成结束后会调用__toString当一个对象被当作一个字符串被调用。__wakeup()使用unserialize时触发__sleep()使用serialize时触发__destruct()对象被销......
  • 【MQ】RabbitMQの概念紹介及び実行方法
    参考URL:<https://www.cnblogs.com/yy-cola/p/11089800.html><https://blog.csdn.net/qq_41097820/article/details/88793329>■中心概念【Message】消息消息是不具名的,它由消息头和消息体组成,消息体式不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由......
  • Weblogic < 10.3.6 'wls-wsat' XMLDecoder 反序列化漏洞(CVE-2017-10271)
    Weblogic<10.3.6'wls-wsat'XMLDecoder反序列化漏洞(CVE-2017-10271)Weblogic的WLSSecurity组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。环境搭建cdweblogic/CVE-2017-10271docker-compose......
  • C# Json序列化的格式化问题
    问题来源: 客户要求传送给他的JSON文件的float型格式化为2位小数,数值型有30-40个栏位,一个一个修改也不是很好.bing和百度找到的方式都是自己定义一个JsonConverter,进行格式化.找到的都是在字符串两边加++的例子,核心转化的代码如下:classStringFormatConverter:JsonCo......
  • linux中使用docker安装rabbitmq
    首先确保linux中docker环境正常运行。1、搜索docker镜像dockersearchrabbitmq2、拉取镜像dockerpullrabitmq3、启动rabbitmqdockerrun-d--namerabbitmq1--restartalways-p15672:15672-p5672:5672rabbitmq4、启动web工具 1)进入容器:dockerexec-itrabbi......
  • RabbitMQ -- 集群(二)
    镜像队列队列创建只在创建的机器上出现,不会出现在其他节点上,需要创建镜像队列,将队列备份到其他节点,可以备份到其他节点或者全部节点创建:在任意一个节点上添加一个policy即可在Web管理界面设置:admin->policies->Add/updateapolicy->Name:mirror-twoPattern:^mirror......
  • php反序列化
    serialize()函数“所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。”在程序执行结束时,内存数据便会立即销毁,变量所储存的数据便是内存数据,而文件、数据库是“持久......
  • 万字长文:从 C# 入门学会 RabbitMQ 消息队列编程
    RabbitMQ教程 目录RabbitMQ教程RabbitMQ简介安装与配置安装RabbitMQ发布与订阅模型生产者、消费者、交换器、队列多工作队列交换器类型DirectFanoutTopic交换器绑定交换器消费者、消息属性Qos、拒绝接收消息确认模式消息持久化消息TTL时......
  • 安装Rabbitmq
    1、使用docker拉取镜像。dockersearchrabbitmq2、安装镜像。dockerpullrabbitmq3、运行mq。dockerrun-d--namerabbitmq-p15672:15672-p5673:5672rabbitmq4、通过dockerps-a查看部署的mq容器id,在通过dockerexec-it容器id/bin/bash进入容器内......