MSMQ 的持久化

MSMQ消息队列技术详解与实战应用 消息队列作为分布式系统解耦的核心组件,通过异步通信机制实现系统间可靠的消息传递。其工作原理基于生产者-消费者模式,发送方将消息存入队列后立即返回,接收方按需处理,有效解决跨时区协作、移动设备同步等高并发场景下的通信问题。MSMQ作为微软推出的企业级消息中间件,凭借消息持久化、事务支持等特性,在金融交易、电商秒杀等对可靠性要求严格的场景中表现突出。通过合理的队列配置和性能监控,可以构建出支持日均百万级消息处理的稳定系统。本文结合Windows服务器部署、C#开发示例等实战经验,深入解析MSMQ在.NET技术栈 阅读详情

MSMQ的消息默认是放在内存里面的. 重启服务或者断电的时候消息就没了. 对于重要的消息来讲这样肯定是不行的.

百度了好久也没发现如何持久化. 后来实在不行上Google 才找到对应的答案.
废话少说. 直接上答案.

标准答案就一句话 msg1.Recoverable = true;

System.Messaging.Message msg1 = new System.Messaging.Message(person);
msg1.Recoverable = true;//为true 的时候进行持久化.每个信息的Recoverable 为true 那么持久保存
mq.Send(msg1, transaction);

//下面的是全部的测试代码.. 可以不看..
//主测试方法

  public class TestMQ
    {

       static string path = ".\\private$\\TestMQ";
        // 接收消息的函数  
       public static Object[] Receive()
        {
            MessageQueue mq; 
            if (MessageQueue.Exists(path))
            {
                mq = new MessageQueue(path);
            }
            else
            {
                mq = MessageQueue.Create(path);
            }

            // 定义消息队列中所有的消息种类(种类之间的顺序可以互换)  
            Type[] msgTypes = new Type[] { typeof(Person), typeof(Order), typeof(String) };

            // 规定消息以XML格式编码  
            mq.Formatter = new XmlMessageFormatter(msgTypes);

            // 定义事务  
            MessageQueueTransaction transaction = new MessageQueueTransaction();

            try
            {
                // 如果消息队列采用了事务,则开始事务  
                if (mq.Transactional)
                    transaction.Begin();

                System.Messaging.Message msg1 = mq.Receive(transaction);
                Person person = (Person)msg1.Body;

                System.Messaging.Message msg2 = mq.Receive(transaction);
                Order order = (Order)msg2.Body;

                System.Messaging.Message msg3 = mq.Receive(transaction);
                string description = (String)msg3.Body;

                // 如果消息队列采用了事务,则停止事务  
                if (mq.Transactional)
                    transaction.Commit();

                return new Object[] { person, order, description };
            }
            catch (Exception ex)
            {
                // 如果消息队列采用了事务并且出现了异常,则终止事务  
                if (mq.Transactional)
                    transaction.Abort();

                return null;
            }
        }

        // 发送消息的函数  
       public static bool Send(Person person, Order order, string description)
        { 
            MessageQueue mq;
            if (MessageQueue.Exists(path))
            {
                mq = new MessageQueue(path);
            }
            else
            {
                mq = MessageQueue.Create(path);
            }
            mq.DefaultPropertiesToSend.Recoverable = true;  //为true 的时候进行持久化. 经测试好像没用. 
            //mq.DefaultPropertiesToSend.AcknowledgeType = AcknowledgeTypes.NegativeReceive; 消息是否需要反馈.
            // 规定消息以XML格式编码  
            mq.Formatter = new XmlMessageFormatter(new Type[] { typeof(Person), typeof(Order), typeof(String) });

            // 定义事务  
            MessageQueueTransaction transaction = new MessageQueueTransaction();
            System.Messaging.Message msg1 = new System.Messaging.Message(person);
            System.Messaging.Message msg2 = new System.Messaging.Message(order); 
            System.Messaging.Message msg3 = new System.Messaging.Message(description);

            try
            {
                // 如果消息队列采用了事务,则开始事务  
                if (mq.Transactional)
                    transaction.Begin(); 

                msg1.Recoverable = true;//为true 的时候进行持久化.
                mq.Send(msg1, transaction);


                msg2.Recoverable = true;//为true 的时候进行持久化.
                mq.Send(msg2, transaction);

                msg3.Recoverable = false;//为true 的时候进行持久化.
                mq.Send(msg3, transaction);

                // 如果消息队列采用了事务,则停止事务  
                if (mq.Transactional) {                 
                    transaction.Commit();
                }
                return true;
            }
            catch (Exception ex)
            {
                // 如果消息队列采用了事务并且出现了异常,则终止事务  
                if (mq.Transactional)
                    transaction.Abort();

                return false;
            }
            finally
            {

                mq.Close();
                msg1 = null;
                msg2 = null;
                msg3 = null;
            }
        }

    }

下面是两个model类

 // 购物清单  
    public class Order
    {
        public Order()
        {
            Price = 0.0;
            Number = 0;
            Time = DateTime.Now;
        }

        public Order(Double price, UInt64 number, DateTime time)
        {
            Price = price;
            Number = number;
            Time = time;
        }

        // 物品单价  
        Double Price;

        // 物品数量  
        UInt64 Number;

        // 下单时间  
        DateTime Time;
    }  
// 人员类  
    public class Person
    {
        public Person()
        {
            m_Name = "";
            m_Age = 0;
        }

        public Person(string name, UInt16 age)
        {
            m_Name = name;
            m_Age = age;
        }

        // 姓名  
        public string Name
        {
            get { return m_Name; }
            set { m_Name = value; }
        }

        // 年龄  
        public UInt16 Age
        {
            get { return m_Age; }
            set { m_Age = value; }
        }

        private string m_Name;
        private UInt16 m_Age;
    }  
    //发送按钮
        private void 发送按钮_Click(object sender, EventArgs e)
        {

            for (int i = 0; i < 100000; i++)
            {
                Person person = new Person("Jackie", 30);
                Order order = new Order(110.0, 10, DateTime.Now);
                string description = "This is a new order.";
                TestMQ.Send(person, order, description);
                System.GC.Collect();
            } 

        }
 private void 接收按钮_Click(object sender, EventArgs e)
        {
            // 接收消息。返回值为 null 时表示接收失败  
            Object[] message = TestMQ.Receive();

            if (message != null)
            {
                // 当消息接收成功时,将消息依次取出并存入下面的对象中  
                Person person = (Person)message[0];
                Order prder = (Order)message[1];
                string description = (string)message[2];
                if (description == "This is a new order.")
                {
                    MessageBox.Show("消息接收成功 !");
                }
                else
                {
                    MessageBox.Show("消息接收失败 !");
                }

            }
            else
            {
                MessageBox.Show("消息接收失败 !");
            }  
        }
MSMQ消息队列技术实战:基础与应用 本文还有配套的精品资源,点击获取 简介:MSMQ是微软提供的消息队列技术,用于分布式系统中的异步通信和解耦。本文将介绍MSMQ的基本概念、工作原理、消息传递模式、安全性以及实际应用场景。读者将了解如何通过.NET框架操作MSMQ,包括创建队列、发送和接收消息,以及处理消息确认和错误。MSMQ的应用有助于提高系统的稳定性和可扩展性,使其在无网络连接时、负载均衡、解耦应用组件及... 阅读详情

相关推荐

MSMQ实用编程案例及源代码分析

本文还有配套的精品资源,点击获取 简介:MSMQ是微软提供的消息队列技术,允许应用程序异步通信,尤其在不稳定网络条件下保证消息可靠传输。本文通过MSMQ实例,深入探讨了消息队列原理、消息生命周期、持久性、安全性、事务支持、消息优先级、远程队列与路由等关键概念,并展示了如何使用.NET Framework和WCF与MSMQ交互,创建、发送和接收消息。开发者可以通过这些实例代码...

weixin_35755823的博客 1377

MSMQ支持三种消息发送模式

http://msdn.microsoft.com/msdnmag/issues/02/11/AdvancedBasics/ http://msdn2.microsoft.com/en-us/library/ms811055.aspx http://www.codep

jackthj的专栏 2228

深入了解MSMQ消息队列技术

通过上述的策略和配置,MSMQ提供了一个健壮的框架来保证消息在分布式系统中的可靠传递。这些机制能够有效减少系统故障和网络问题带来的影响,确保消息服务的高可用性和稳定性。微软的MSMQ官方文档被分为多个部分,涵盖安装、配置、编程和故障排除等主题。每个部分都包含了丰富的子主题和子章节。关键部分包括:安装与配置:这部分涵盖了安装MSMQ服务、配置消息队列和网络的步骤。它还讨论了如何设置消息队列的安全性和权限。编程指南。

weixin_30700095的博客 565

消息队列MSMQ

一、MSMQ介绍和安装消息队列 原理:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为message),然后把它保存至一个系统公用空间的消息队列(message queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。 消息可以以两种方式发送,即快递方式(express)和可恢复模式(recoverable),它们的区别在于,快递方式为了消息的快...

banggujuan3308的博客 303

msmq 个人的一些理解

msmq,微软的MSMQ一些理解

MSMQ、RabbitMQ、ActiveMQ消息队列调试工具

可用于调试MSMQ、RabbitMQ、ActiveMQ三种消息队列 其中MSMQ支持Active、Binary、XML格式(要勾选事务) RabbitMQ支持逐条接发、批量接发、RPC回调模式、新建队列、建立持久化队列、连接测试等功能。

微软消息队列-MicroSoft Message Queue(MSMQ)队列的C#使用

什么是MSMQ Message Queuing(MSMQ) 是微软开发的消息中间件,可应用于程序内部或程序之间的异步通信。主要的机制是:消息的发送者把自己想要发送的信息放入一个容器中(我们称之为Message),然后把它保存至一个系统公用空间的消息队列(Message Queue)中;本地或者是异地的消息接收程序再从该队列中取出发给它的消息进行处理。下图展...

每天都有新发现 1586

msmqJava.jar和msmqJava.dll

使用JNI技术和微软的MSMQ发送信息和获取消息所需的dll文件和jar包

WCF-MSMQ

机器上需要MSMQ相关组件2.需要将契约中操作设置为单向3.终结点中添加netMsmqBinding <netMsmqBinding> <!-- 是否持久化在硬盘 只有一次 存放失败的消息队列--> <binding nam...

weixin_30730053的博客 97

英飞凌功率MOSFET SPICE 瞬态仿真不收敛问题解决(基于TINA)

英飞凌功率MOSFET SPICE仿真容易出现不收敛问题,这个对于IGBT和SIC的管子应该是一样的,在瞬态仿真分析中,出现如下图所示的报错,Convergence problem。spice是为线性电路设计的,例如运算放大器、线性电源等,不是专门仿真开关电路的。在瞬态仿真时,仿真器是要不断迭代求解的,开关快速的跳变,容易在迭代式出现不收敛的问题。,由于时间步长减少,会消耗更多的计算机内存,如果运行多次内存消耗过大,会报“Out of memory”.解决方法是:报错工程,重启软件,内存重新计算。

miaoxiaokeji的博客 2297

智能生活中枢:基于 ESP32-S3 的桌面智能助手与日程提醒终端设计与实现

本文完成了基于 ESP32-S3 的桌面智能助手与日程提醒终端的完整设计,实现了时间同步、日程管理、声光提醒、环境监测、本地存储等核心功能。硬件接线简洁、软件逻辑清晰,可直接制作成品使用。硬件方案:以 ESP32-S3 为核心,搭配 OLED、DS3231、DHT11、按键、声光模块,接线标准化、易复刻;软件方案:基于 Arduino 开发,提供标准 Mermaid 软件流程图,代码模块化、可直接编译运行;核心功能:网络授时、本地日程管理、掉电存储、声光提醒、温湿度监测,满足桌面智能助手全场景需求。

weixin_42300449的博客 209

MSMQ 处理机制

1.基本处理方式 1.创建消息队列 2.发送消息 3.接收消息 public class MSMQ { /// <summary> /// 通过Create方法创建使用指定路径的新消息队列 /// </summary> /// <param na...

weixin_30707875的博客 124

基于FFT的轴承故障诊断 - MATLAB代码和详细解释

最后,我们可以根据异常特征的位置和特征分析来确定轴承故障的类型。最后,我们可以根据异常特征的位置和特征分析来确定轴承故障的类型。因此,通过分析频谱图,我们可以识别轴承故障的特征。因此,通过分析频谱图,我们可以识别轴承故障的特征。我们可以选择适当的阈值,并在频谱图上标记异常特征。通过这种基于FFT的轴承故障诊断方法,我们可以快速、准确地检测和诊断轴承故障。接下来,我们将应用FFT来获取振动信号的频谱信息,频谱显示了信号在不同频率上的能量分布。通过将异常特征标记在频谱图上,我们可以直观地识别轴承故障的存在。

COWizard的博客 613

[WCF MSMQ] 2. 队列与事务

MSMQ 支持两种类型的队列,事务性队列(transactionalqueue)会将消息持久(persiste)存储到磁盘中,即便服务器当机(shutdown)、重启(reboot)或崩溃(crash),消息依然可以在系统恢复后被读取。同时,消息发布、获取和删除都在环境事务范围内,从而确保消息的可靠性。我们还可以使用 TransactionScope将环境事务传递给队列,否则队列会自动

微软新技术 1814

SAP 关于替代料物料混用问题处理方案简介

电子料很多都是需要进行替代的,并且需要考虑当A物料库存不足时,需要考虑B物料的库存来满足需求,当需求不满足的时候也需要考虑物料的价格因素,同时考虑价格低的物料进行采购。3、还遇到过比较奇葩的处理替代料的解决方案就是将SAP系统中的需求数据用接口的方式全部传输到外围系统,同时还将所有物料的库存信息都通过接口的方式传输到外围系统中,然后通过外围系统进行替代料逻辑的处理,然后在回写回SAP更改BOM中的优先级,然后在重新下单,貌似解决了替代料的问题,但是好像又没有解决。时间:2024-01-27。

我小时候很黑的博客 2352

108、AWB 时间滤波器:帧间白平衡平滑,防止色彩跳变与过冲

摘要: 文章探讨了AWB(自动白平衡)时间滤波器的设计与优化,以解决帧间白平衡跳变和过冲问题。通过自适应状态机(STABLE/TRANSITION/JUMP)动态调整平滑系数alpha,结合帧率归一化和过冲保护(方向检测+限幅),实现场景切换快速响应与静态稳定性的平衡。作者分享了工程经验:避免固定阈值、联动AE/AF、真实场景验证,并推荐简化卡尔曼滤波替代IIR。最终方案在旗舰机前置摄像头中成功消除“闪白”现象,强调参数需动态适应光照与色温变化。

sundong_81的博客 64

基于MSMQ绑定的WCF服务实现总结

http://www.cnblogs.com/zhili/p/WCFMSMQ.html http://www.cnblogs.com/enternal/p/5275447.html 转载于:https://www.cnblogs.com/tianboblog/p/7239638.html

weixin_30278237的博客 83

告别 DEFINE VIEW:CDS View Entity 迁移全景实战(报表迁移 + ADT 向导 + 避坑清单)

CDS迁移的关键要点与策略 CDS DDIC-based View已被标记为废弃,迁移到CDS View Entity成为必要。迁移面临的主要挑战包括激活成本、命名约束和依赖风险。ABAP 7.57及以上版本必须优先处理,否则将积累技术债务。 迁移方式主要有两种: 报表路线:适合渐进式迁移的On-Premise项目 ADT向导:适合云环境批量迁移 关键注意事项: 必须提前检查SQL View依赖关系 金额/数量字段需要显式引用单位/货币字段 建议按使用场景分批迁移 最佳实践是结合报表进行系统盘点,再通过AD

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 208

化零为整WCF(16) - 消息队列(MSMQ - MicroSoft Message Queue)

 化零为整WCF(16) - 消息队列(MSMQ - MicroSoft Message Queue)作者:webabcd介绍WCF(Windows Communication Foundation) - 消息队列(MSMQ - MicroSoft Message Queue):    netMsmqBinding的binding属性配置如下:    ·ExactlyOnce - 确保

canduecho的专栏 653

9篇9章1节:认识 SHARE 数据库

SHARE数据库是欧洲最大的跨国老龄化追踪调查项目,覆盖28个欧洲国家和以色列的50岁及以上人群。自2004年启动以来,已完成14-16万受访者的50-60万次访谈,形成跨度20年的纵向数据。该数据库采用标准化的多阶段抽样方法,收集健康、经济和社会关系等领域的多维度信息,具有高度的跨国可比性。SHARE与美国HRS、英国ELSA等调查对接,构成全球老龄化研究网络。数据免费向科研人员开放,但需注册并承诺仅用于非商业性研究。该项目由欧盟委员会等多方资助,为老龄化研究和政策制定提供了重要实证依据。

MD Code 901

OpenCV-Python实战(3)——OpenCV中绘制图形与文本

OpenCV 是一个的跨平台计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。本文介绍了 OpenCV 提供的与绘制图形和文本相关的函数。在图形方面,我们了解了如何绘制基本图形(直线、矩形和圆形等)以及高级图形(剪裁线、箭头、椭圆和多边形)。在文本方面,我们了解了如何绘制文本以及 OpenCV 库中的所有可用字体。

盼小辉丶的博客 2万+

MSMQ与Spring Boot Redis缓存预热实战指南

消息队列作为分布式系统的异步通信基石,通过解耦生产者和消费者提升系统可靠性。MSMQ作为Windows平台经典消息中间件,支持事务处理和持久化消息,特别适合工业控制等强一致场景。缓存预热则是应对高并发的关键技术,Spring Boot通过CommandLineRunner机制,在应用启动时将MySQL热点数据加载到Redis,有效防止缓存击穿。本文结合工业级实践,详解MSMQ配置优化与Redis多级缓存策略,包含事务处理、TTL随机化等工程技巧,帮助开发者构建高性能分布式系统。

weixin_34059951的博客 415

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

[MQ]关于ActiveMQ的配置

目前常用的消息队列组建无非就是MSMQ和ActiveMQ,至于他们的异同,这里不想做过多的比较。简单来说,MSMQ内置于微软操作系统之中,在部署上包含一个隐性条件:Server需要是微软操作系统。(对于这点我并去调研过MSMQ是否可以部署在非微软系统,比如:Linux,只是拍脑袋想了想,感觉上是不可以)。对于ActiveMQ,微软系统和Linux都是可以部署的。从功能方面来说,一般最常...

weixin_30813225的博客 588

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

NServiceBus翻译之持久化技术(一):Persistence In NServiceBus

Last Updated: Dec 03, 2012 08:24PM IST NserviceBus中有很多特征都要求信息的持久化,主要是timeouts,Sagas,以及subscription的存储。 NserviceBus中有四种持久化技术: 1.RavenDB 2.NHibernate 3.In Memory 4.MSMQ 关于RavenDB的安装可以看hereand怎么样连...

jiq•钦's technical Blog 235

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

消息中间件简介

消息中间件是一种由消息传送机制或消息队列模式组成的中间件技术,利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。目前业界有很多的MQ产品,像RabbitMQ、ActiveMQ、ZeroMQ等都是极好的消息中间件,但是我们在项目中该选择哪个更适合呢?本文针对以下几种消息队列产品作了评估比较:RabbitMQ、ZeroMQ、ActiveMQ、MSMQ、Redis、memcacheQ 题外话:这里我们可以先思考个小问题“Web应用中为什么会需要消息队列服务?” ..

weixin_57763462的博客 537
上一篇: sqlbulkcopy 该字符串未被识别为有效的 DateTime
下一篇: C# 判断Socket断线重连
走错路的程序员
博客等级 码龄19年 1256粉丝 507原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值