在对远程的MSMQ访问的时候,发现一个奇怪的现象

static string path = @"FormatName:DIRECT=TCP:sha-db\private$\mt1";

//check is existed and create 
           if (MessageQueue.Exists(path) == false) 
           { 
               MessageQueue.Create(path,false); 
           }

就如下代码,会报错,队列路径非法类似的错误,google了很多,都没有个解决方法。后来查到篇个回帖

http://stackoverflow.com/questions/1914885/cannot-determine-whether-a-queue-with-the-specified-format-name-exists

说 MessageQueue.Exists 文档中说:Exists方法不支持FormatName 前缀。Exists 方法不能验证远程队列。参考:http://msdn.microsoft.com/zh-cn/library/system.messaging.messagequeue.exists.aspx

文中还提供了其他可以实现的方法。

虽然Exists方法会失败,但是不影响它发送消息,只要路径写对,照样可以发送出去。

---------------------------------------------------------------------------------

还有一个奇怪的现象。

使用for语句插入2000条消息,在消息队列的窗口最多只能看到1000条,当你取出一条后,才能看到后一条。

估计是设计使然。

---------------------------------------------------------------------------------

下面的方法是一些示例代码,主要是多线程发消息和去消息

多线程

//watch.Restart(); 
           //Thread t1 = new Thread(send); 
           //Thread t2 = new Thread(send); 
           //Thread t3 = new Thread(send); 
           //Thread t4 = new Thread(send); 
           //t1.Start(); 
           //t2.Start(); 
           //t3.Start(); 
           //t4.Start();

//t4.Join(); 
           //t1.Join(); 
           //t2.Join(); 
           //t3.Join(); 
           //t4.Join(); 
           //watch.Stop(); 
           //SaveFile(@"c:\msmqlog.txt", "多线程发送" + j + "条消息,每条大小约40k,时间:" + watch.Elapsed.ToString());

委托异步执行

// Action a = new Action(() => 
           // { 
           //     for (int i = 0; i < 5000; i++) 
           //     { 
           //         Console.WriteLine(i); 
           //         queue.Send(s, transactionType); 
           //     } 
           //     queue.Close(); 
           // });

//watch.Restart(); 
           //IAsyncResult ia= a.BeginInvoke((ar) => { 
           //     SaveFile(@"c:\msmqlog.txt", "异步发送" + j + "条消息,每条大小约40k,时间:" + watch.Elapsed.ToString()); 
           // }, null); 
           // a.EndInvoke(ia);

同步的读取消息

//int index = 0; 
           //MessageEnumerator me = queue.GetMessageEnumerator2(); 
           //watch.Restart(); 
           //while (me.MoveNext()) 
           //{ 
           //    Console.Write(me.Current.Id + "-"); 
           //    Console.WriteLine(++index); 
           //    me.RemoveCurrent(); 
           //    me.Reset(); 
           //} 
           //watch.Stop(); 
           //SaveFile(@"c:\msmqlog.txt", "删除" + index + "条消息,每条大小约40k,时间:" + watch.Elapsed.ToString());

多线程读取消息

Thread t1 = new Thread(() =&gt; receive("1"));//使用拉姆达表达式往线程中传参数 
           Thread t2 = new Thread(() =&gt; receive("2")); 
           Thread t3 = new Thread(() =&gt; receive("3")); 
           Thread t4 = new Thread(() =&gt; receive("4"));

t1.Start(); 
           t2.Start(); 
           t3.Start(); 
           t4.Start();

t1.Join(); 
           t2.Join(); 
           t3.Join(); 
           t4.Join();

Console.WriteLine(); 
       }

//GetMessageEnumerator2()方式取消息,

//在并发情况下,可能游标所指定的消息被其他线程删除,抛异常。

static public void GetMessage(string i) 
       { 
           MessageQueue queue = new System.Messaging.MessageQueue(path); 
           MessageEnumerator me = queue.GetMessageEnumerator2(); 
           int index = 0; 
           while (me.MoveNext()) 
           { 
               try 
               { 
                   Console.Write(me.Current.Id + "-"); 
                   Console.WriteLine(++index); 
                   string s = me.Current.Id + "-"; 
                   SaveFile(@"c:\" + i + ".txt", s + index); 
                   me.RemoveCurrent(); 
                   me.Reset(); 
               } 
               catch (Exception ex) 
               { 
                   SaveFile(@"c:\" + i + ".txt", ex.Message); 
               } 
           } 
       }

//Receive方式取消息

static public void receive(string i) 
       { 
           MessageQueue queue = new System.Messaging.MessageQueue(path);

while (true) 
           { 
               try 
               { 
                   Message me= queue.Receive(new TimeSpan(0,0,1)); 
                   me.Formatter = new System.Messaging.XmlMessageFormatter((new Type[] { typeof(string) })); 
                   Console.WriteLine(me.Id + "-"); 
                   SaveFile(@"c:\" + i + ".txt", me.Id); 
               } 
               catch (MessageQueueException ex1) 
               { 
                   if (ex1.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout) 
                   { 
                       Console.WriteLine("MessageQueueErrorCode.IOTimeout"); 
                       SaveFile(@"c:\" + i + ".txt", "MessageQueueErrorCode.IOTimeout"); 
                       Thread.Sleep(5000); 
                   } 
               } 
               catch (Exception ex) 
               { 
                   Console.WriteLine(ex.Message); 
                   SaveFile(@"c:\" + i + ".txt", ex.Message); 
               } 
           } 
       }

static public void send() 
       { 
           string s = ReadFile(@"c:\pp.txt"); 
           MessageQueueTransactionType transactionType = MessageQueueTransactionType.None; 
           MessageQueue queue = new System.Messaging.MessageQueue(path); 
           //int j = 10000; 
           for (int i = 0; i &lt; 1250; i++) 
           { 
               Console.WriteLine(i); 
               queue.Send(s, transactionType); 
           } 
           queue.Close(); 
       }

本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/618278 ,如需转载请自行联系原作者

MessageQueue的使用方法(二)相关推荐

  1. 链表问题15——将搜索二叉树转换成双向链表(方法二)

    题目 题目同上一篇文章,即题目将二叉树按照中序顺序转换成双向链表 思路 方法二:利用递归函数,不使用任何容器.时间复杂度为O(N),额外空间复杂度为O(h),h为二d d d df叉树的高度 首先需要 ...

  2. 链表问题14——在单链表种删除指定值的节点(方法二)

    题目 题目可参考上一篇文章,删除链表中的指定值 思路 方法二:不用任何容器,直接调整.时间复杂度O(N),空间复杂度O(1) 因为最后计划返回链表头,所以先遍历链表按顺序找到第一个不等于num的节点作 ...

  3. 链表问题13——删除无序单链表中值重复出现的节点(方法二)

    题目 同上一篇题目,本篇介绍方法二类似于选择排序的过程,时间复杂度为O(),额外空间复杂度为O(1), 思路 按顺序遍历节点 先是记录当前节点,然后去查看后面是否还有重复,有的话删掉,直到遍历完 然后 ...

  4. 链表问题12——将单链表的每K个节点之间逆序(方法二)

    题目 题目同上一篇方法一中的题目. 思路 方法二:在原链表中调整 用变量记录每一组开始的第一个节点,最后一个节点,然后逆序即可. 源码 public class Node{public int val ...

  5. 链表问题10——两个单链表生成相加链表(方法二)

    题目 假设链表中每一个节点的值都在0-9之间,链表整体代表一个整数. 给定两个这种链表的头节点,请生成代表两个整数相加值的结果链表. 链表1 链表2 生成的新链表 9->3->7 6-&g ...

  6. 多台linux无密码访问之方法二

    一:实验环境同"多台linux无密码访问之方法一" 二:配置过程 前3步同"多台linux无密码访问之方法一" ★第四步不同于方法一 4.在.ssh目录下创建一 ...

  7. 攻防世界(Pwn) forgot---栈溢出;(方法二)

    攻防世界(Pwn) forgot-栈溢出:(方法一) 里面对问题描述的更详细一点 返回目标函数 0x80486CC 方法二(爆破流) 因为最终返回的是 v3[0]-v3[9] 之中的一个函数, v3[ ...

  8. windows右键没有显示“文本文档”的解决办法(建议用方法二)

    很多时候,我们要使用记事本的话,都是通过右键---新建文本文档来实现.但是,当系统设置不当,有时候右键的新建菜单里就没有新建文本文档这一项.下面就讲讲怎么恢复右键的新建菜单,让新建文本文档重新出现 工 ...

  9. python使用近似公式计算e_python如何算自然底数e(方法二)

    原标题:python如何算自然底数e(方法二) e的展开式 e的近似值 e ≈ 2.71828 18284 59045 23536 02874 71352 66249 77572 47093 6999 ...

最新文章

  1. 分享一下收到的微软CRM云分享计划 邮件
  2. 简约之美jodd--props属性使用
  3. hiveServer2 和 metastore的一点解读。
  4. anaconda怎么运行python程序_怎么用cmd运行python
  5. 【体验】Silverlight 2.0 多图
  6. 用命令行快速打开软件
  7. linux中查找grep与find命令的使用
  8. Raki的读paper小记:Rational LAMOL: A Rationale-Based Lifelong Learning Framework
  9. 在校大学生如何用编程赚钱?| 我的大学赚钱之路
  10. Redis分布式锁故障,我忍不住想爆粗...
  11. Prometheus metric
  12. Ubuntu 中使用 xdg-open 命令高效打开文件
  13. 手机储存卡数据如何恢复
  14. 职场新人如何招架同事倚老卖老?
  15. MySQL索引的底层数据结构衍变史
  16. 城市列表-根据拼音首字母排序
  17. Python利用matplotlib制作雷达扫描显示仪(之后可结合串口和超声波传感器使用,亦可以做为仪表盘使用)
  18. 经典广告语 广告语对话
  19. js常见弹窗以及简单使用
  20. 备考通信复试过程中的一些知识点总结梳理——信源编码

热门文章

  1. 发送和接收_通用异步接收器/发送器(UART)
  2. Linux netstat命令详解和使用例子(显示各种网络相关信息)
  3. 【bzoj2060】[Usaco2010 Nov]Visiting Cows拜访奶牛 树形dp
  4. python之gevent模块实现协程
  5. 关于FileSystemWatcher监听文件创建
  6. [LeetCode]Power
  7. A站有一个页面需要PV统计 A站读写该数据 B站读该数据 需要数据同步
  8. jquery 如何动态添加、删除class样式方法介绍_jquery_脚本之家
  9. TinyFrame开篇:基于CodeFirst的ORM
  10. 收到朋友寄来的煎饼了