MessageQueue的使用方法(二)
在对远程的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(() => receive("1"));//使用拉姆达表达式往线程中传参数
Thread t2 = new Thread(() => receive("2"));
Thread t3 = new Thread(() => receive("3"));
Thread t4 = new Thread(() => 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 < 1250; i++)
{
Console.WriteLine(i);
queue.Send(s, transactionType);
}
queue.Close();
}
MessageQueue的使用方法(二)相关推荐
- 链表问题15——将搜索二叉树转换成双向链表(方法二)
题目 题目同上一篇文章,即题目将二叉树按照中序顺序转换成双向链表 思路 方法二:利用递归函数,不使用任何容器.时间复杂度为O(N),额外空间复杂度为O(h),h为二d d d df叉树的高度 首先需要 ...
- 链表问题14——在单链表种删除指定值的节点(方法二)
题目 题目可参考上一篇文章,删除链表中的指定值 思路 方法二:不用任何容器,直接调整.时间复杂度O(N),空间复杂度O(1) 因为最后计划返回链表头,所以先遍历链表按顺序找到第一个不等于num的节点作 ...
- 链表问题13——删除无序单链表中值重复出现的节点(方法二)
题目 同上一篇题目,本篇介绍方法二类似于选择排序的过程,时间复杂度为O(),额外空间复杂度为O(1), 思路 按顺序遍历节点 先是记录当前节点,然后去查看后面是否还有重复,有的话删掉,直到遍历完 然后 ...
- 链表问题12——将单链表的每K个节点之间逆序(方法二)
题目 题目同上一篇方法一中的题目. 思路 方法二:在原链表中调整 用变量记录每一组开始的第一个节点,最后一个节点,然后逆序即可. 源码 public class Node{public int val ...
- 链表问题10——两个单链表生成相加链表(方法二)
题目 假设链表中每一个节点的值都在0-9之间,链表整体代表一个整数. 给定两个这种链表的头节点,请生成代表两个整数相加值的结果链表. 链表1 链表2 生成的新链表 9->3->7 6-&g ...
- 多台linux无密码访问之方法二
一:实验环境同"多台linux无密码访问之方法一" 二:配置过程 前3步同"多台linux无密码访问之方法一" ★第四步不同于方法一 4.在.ssh目录下创建一 ...
- 攻防世界(Pwn) forgot---栈溢出;(方法二)
攻防世界(Pwn) forgot-栈溢出:(方法一) 里面对问题描述的更详细一点 返回目标函数 0x80486CC 方法二(爆破流) 因为最终返回的是 v3[0]-v3[9] 之中的一个函数, v3[ ...
- windows右键没有显示“文本文档”的解决办法(建议用方法二)
很多时候,我们要使用记事本的话,都是通过右键---新建文本文档来实现.但是,当系统设置不当,有时候右键的新建菜单里就没有新建文本文档这一项.下面就讲讲怎么恢复右键的新建菜单,让新建文本文档重新出现 工 ...
- python使用近似公式计算e_python如何算自然底数e(方法二)
原标题:python如何算自然底数e(方法二) e的展开式 e的近似值 e ≈ 2.71828 18284 59045 23536 02874 71352 66249 77572 47093 6999 ...
最新文章
- 分享一下收到的微软CRM云分享计划 邮件
- 简约之美jodd--props属性使用
- hiveServer2 和 metastore的一点解读。
- anaconda怎么运行python程序_怎么用cmd运行python
- 【体验】Silverlight 2.0 多图
- 用命令行快速打开软件
- linux中查找grep与find命令的使用
- Raki的读paper小记:Rational LAMOL: A Rationale-Based Lifelong Learning Framework
- 在校大学生如何用编程赚钱?| 我的大学赚钱之路
- Redis分布式锁故障,我忍不住想爆粗...
- Prometheus metric
- Ubuntu 中使用 xdg-open 命令高效打开文件
- 手机储存卡数据如何恢复
- 职场新人如何招架同事倚老卖老?
- MySQL索引的底层数据结构衍变史
- 城市列表-根据拼音首字母排序
- Python利用matplotlib制作雷达扫描显示仪(之后可结合串口和超声波传感器使用,亦可以做为仪表盘使用)
- 经典广告语 广告语对话
- js常见弹窗以及简单使用
- 备考通信复试过程中的一些知识点总结梳理——信源编码
热门文章
- 发送和接收_通用异步接收器/发送器(UART)
- Linux netstat命令详解和使用例子(显示各种网络相关信息)
- 【bzoj2060】[Usaco2010 Nov]Visiting Cows拜访奶牛 树形dp
- python之gevent模块实现协程
- 关于FileSystemWatcher监听文件创建
- [LeetCode]Power
- A站有一个页面需要PV统计 A站读写该数据 B站读该数据 需要数据同步
- jquery 如何动态添加、删除class样式方法介绍_jquery_脚本之家
- TinyFrame开篇:基于CodeFirst的ORM
- 收到朋友寄来的煎饼了