博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MessageQueue的使用方法(二)
阅读量:6225 次
发布时间:2019-06-21

本文共 3595 字,大约阅读时间需要 11 分钟。

在对远程的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了很多,都没有个解决方法。后来查到篇个回帖

说 MessageQueue.Exists 文档中说:Exists方法不支持 前缀。Exists 方法不能验证远程队列。参考:

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

虽然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();
       }

转载地址:http://osuna.baihongyu.com/

你可能感兴趣的文章
多选按钮(CheckBox)——Mars Android开发视频教程之第一季第九集(重)
查看>>
订单号消费码生成(线性同余算法)
查看>>
《SQLSERVER2012之T-SQL教程》T-SQL子查询
查看>>
[deviceone开发]-优惠券商户管理端App开源
查看>>
360搜索“搏杀”成功,赢在创新
查看>>
Apache服务出现Forbidden 403的问题总结
查看>>
onSaveInstanceState和onRestoreInstanceState触发的时机
查看>>
Gradle依赖
查看>>
图解Tomcat类加载机制(阿里面试题)
查看>>
在 CentOS Linux 上安装 Cobbler 批量部署系统
查看>>
Jmeter简单应用1
查看>>
Shell之结构判断
查看>>
PULL解析器
查看>>
Bash的那点事
查看>>
易数一键还原(免费的系统备份与还原软件)------创建命令行工具
查看>>
Haproxy+多台MySQL从服务器(Slave) 实现负载均衡
查看>>
CSS3的转换
查看>>
头文件string与string.h的区别
查看>>
我的友情链接
查看>>
Sh脚本-Catalina.sh
查看>>