MSMQ 的持久化
来源:互联网 发布:电信网络诈骗50万以上 编辑:程序博客网 时间:2024/06/03 22:47
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("消息接收失败 !"); } }
0 0
- MSMQ 的持久化
- MSMQ的简单介绍
- wcf的 msmq
- msmq的文章
- MSMQ的简单介绍
- MSMQ的简单应用
- 简单的msmq例子
- MSMQ的安装
- MSMQ的使用
- MSMQ 的理解
- MSMQ
- MSMQ
- MSMQ
- MSMQ
- MSMQ
- MSMQ
- MSMQ
- MSMQ
- c++实验5
- QT+opecv3.2图像显示
- Sum Root to Leaf Numbers
- 基于opencv的Python图像处理
- cii框架影响行数
- MSMQ 的持久化
- onvif的博客李迟的专栏
- RabbitMQ消息队列(一): Detailed Introduction 详细介绍
- Linux/Centos下/lib64/libc.so.6: version `GLIBC_2.14' not found问题(升级glibc2.20)
- 算法题目
- P1001 A+B Problem
- 3Ceph架构剖析
- C++第4次作业(基础班)—循环结构程序设计
- 条件变量pthread_cond_signal、pthread_cond_wait