我有超过20个队列的列表,需要在MSMQ中添加为私有队列.
有没有办法使用它
命令行
C#编程
如果有办法使用某种脚本或.net编程,那么我可以添加它而不用手动输入它并导致拼写错误.
请告诉我.
谢谢
从C#使用MSMQManagement的最佳方法是什么?当远程计算机断开连接时,我需要能够查看和清除本地传出队列.
显然,一些用户可以通过COM API执行此操作,但在COM参考选项卡中,我没有其他网站/博客/帖子提到的"Microsoft Message Queue 3.0对象库"(也没有任何类似的东西).我在机器上搜索了Interop.MSMQ.dll,也找不到它.
我们正在使用VS 2008并在Windows 7 64位上运行.
我错过了什么?是否有其他机制通过"普通"托管类来实现这一目标?
谢谢
作为练习,我试图找到一个实现竞争消费者的例子.
许多生产者 - > MSMQueue < - 竞争消费者
到目前为止,我没有找到任何关于如何实现这一目标的文档.我首次尝试弄清楚如何在MassTransit或NServiceBus中实现如何实现多层间接.
任何帮助将不胜感激.
尝试使用队列时收到此错误:
发生意外错误:通信对象System.ServiceModel.ServiceHost不能用于通信,因为它处于Faulted状态.在System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan超时)
如何克服它?
更新:回答我最后发布的解决方案
我试图找到C#服务器应用程序的瓶颈在哪里未充分利用CPU.我认为这可能是由于磁盘I/O性能不佳而与应用程序本身无关,但我无法从这个假设中得出一个事实.
应用程序从本地MSMQ队列中读取消息,对每条消息进行一些处理,并在处理完消息后,将响应消息发送到另一个本地MSMQ队列.
我正在使用异步循环从队列中读取消息,尽可能快地将它们出列并使用Task.Run调度它们进行处理以启动每个消息的处理(并且不要等待此Task.Run ..只是附加一个延续只记错了记录错误).每个消息被同时处理,即在处理下一个消息之前不需要等待消息被完全处理.
在处理消息的最后,我使用MessageQueue的Send方法(不知何故异步但不是真的因为它必须等待磁盘写入才能返回-see System.Messaging - 为什么MessageQueue不提供异步版本的Send).
对于基准测试,我在队列中排队100K消息(100K消息的总大小约为100MB)然后我启动程序.在我的两台个人计算机上(一台SSD HD和另一台SATA2 HD,i7 CPU四核-8逻辑处理器)我在程序生命周期内达到~95%的CPU使用率(将100K消息出列,处理它们和发送回复).消息尽可能快地出列,尽可能快地处理(这里涉及的CPU),然后对发送到不同本地队列的每个消息进行响应.
现在在运行非HT双核CPU的虚拟机上(不知道什么是底层磁盘,但似乎远不如地雷......在基准测试期间,使用Perfmon我可以看到avg disk sec/write arround 10-15 ms on this虚拟机,而在我的个人计算机上大约2ms)当我运行相同的工作台时,我只能达到~55%的CPU(当我在机器上运行相同的工作台而不向队列发送响应消息时我达到~90%CPU ).
我真的不明白这里有什么问题.似乎很清楚,向队列发送消息是问题并且减慢了程序的全局处理(以及要处理的消息的队列化),但为什么会考虑我使用Task.Run来启动每个出列消息的处理并最终响应发送,我不希望CPU未被充分利用.除非当一个线程正在发送消息时它阻止其他线程在等待返回(磁盘写入)时在同一个核心上运行,在这种情况下,考虑到延迟远远高于我的个人计算机,它可能是有意义的,但是一个线程等待I/O不应该阻止其他线程运行.
我真的想了解为什么我没有达到这台机器至少95%的CPU使用率.我盲目地说这是由于较差的磁盘I/O性能,但我仍然不明白为什么它会导致CPU利用不足,因为我正在使用Task.Run同时运行处理.它也可能是一些与磁盘完全无关的系统问题,但考虑到MessageQueue.Send似乎是问题,并且此方法最终将消息写入内存映射文件+磁盘,我看不出性能问题可能来自何处除了磁盘.
当然,由于程序最大限度地提高了我自己计算机上的CPU使用率,因此确实存在系统性能问题,但我需要找到VM系统上的瓶颈,以及为什么它会影响我的应用程序的并发/速度.
任何的想法 ?
我有从net 3.5移植的.net 4.0应用程序,它使用在服务器2008 x64上运行的net.msmq
建立
现在一切都在使用.net 3.5进行生产.
我在服务器上安装了.net 4.0并创建了新站点以便在同一个盒子上进行暂存.
新的暂存msmq设置是
为不同的站点创建了另一个队列.
我用新网站做的另一个变化是,这是iis中不同的网站,可以监听不同的IP地址.我已将net.msmq绑定到'localhost'.主站点以及net.msmq - >'localhost'具有相同的绑定.我认为应该是这样的.请指出是否需要一些不同的配置.
问题是我的请求正在进入队列但没有被应用程序接收它只是停留在那里
日志中没有任何错误迹象.我在日志中看到的与此相关的事情是警告"msmqactivation无法发现队列".虽然这个警告我从来没有正确理解,因为我们已经看到这总是与3.5中的msmq一切都很好.
我能想到的任何东西都经过验证,而且是正确的.
摘要
请使用net.msmq提供有关多个站点设置的任何信息.我正在为两个站点使用net.msmq绑定值='localhost'.我认为这是机器名称.
有什么方法可以诊断这个问题吗?
您可能想到的任何其他事情都可能有所帮助.
昨天我们不得不推迟释放,因为花了100个工时我们无法弄清问题是什么.也不能让它在我的开发机器中破碎.
编辑
问题是在创建新站点命名约定后不起作用
net.msmq服务地址为"net.msmq://localhost/private/staging/msmqdataservice.svc"net.msmq endpoing,地址为MSMQ中的"net.msmq://localhost/private/staging/msmqdataservice.svc"队列 - > name ="$ private\staging/msmqdataservice.svc"
它使用服务名称net.msmq://localhost/private/msmqdataservice.svc
但现在我不能让两个站点使用完全相同的端点.
在同一台机器上的不同url和不同队列的两个不同站点中有相同端点的方法吗?
我想查看我的队列,msm控制台snapin有这个属性对话框,但它很难阅读,对我很重要的消息被编码,如下所示:
3C 3F 78 6D 6C 20 76 65 <?xml ve
72 73 69 6F 6E 3D 22 31 rsion="1
2E 30 22 20 65 6E 63 6F .0" enco
64 69 6E 67 3D 22 75 74 ding="ut
66 2D 38 22 3F 3E 0D 0A f-8"?>..
3C 65 73 62 3A 6D 65 73 <esb:mes
73 61 67 65 73 20 78 6D sages xm
6C 6E 73 3A 65 73 62 3D lns:esb=
22 68 74 74 …Run Code Online (Sandbox Code Playgroud) 我知道当我尝试创建新的时MessageQueue,InvalidOperationException如果未启用消息队列,系统将抛出.
但是如何以编程方式知道机器上是否启用了消息队列?我在两个不同的代码库中使用C#2.0和C#4.0.
我见过很多套接字应用,其中有MSMQ的使用.但是当我详细介绍时,我认为我们可以在没有MSMQ的情况下做到这一点,所以我想知道MSMQ的主要优点是什么.为什么有人在他自己的应用程序中使用MSMQ.
我有一个WCF服务.它与MSMQ绑定,但这不是问题.我可以序列化一个对象,它有一个基类和一个在基类中实现的接口,具体类派生自基类 - 这很好.
但是,当我在基类中有一个枚举并且我设置了该值时,在从MSMQ反序列化/读取之后,该值仍然设置为默认值(即不是在代码中手动设置的值)
有什么想法吗?我甚至将枚举标记为DataContract以及每个具有EnumMember属性的Enum成员.
如何序列化枚举?
msmq ×10
c# ×6
.net ×3
wcf ×3
async-await ×1
com ×1
command-line ×1
masstransit ×1
messaging ×1
nservicebus ×1
performance ×1