Tag: msmq

如何在MSMQ队列上获取所有可用消息

什么是获取当前队列中的所有消息进行处理的最佳方法? 我们有一个包含大量非常小的消息的队列,我想要做的是读取所有当前消息,然后通过线程池发送它们进行处理。 我似乎无法找到任何好的资源,它将告诉我如何创建一个简单的方法来返回IEnnumerable例如 谢谢

MSMQ接收和删除

是否有任何选项可以在读取消息后从MSMQ中删除消息? 比如,receive + delete可以作为primefaces操作运行吗?

如何检查公共MSMQ是否为空

有没有办法检查公共MSMQ是否为空? 对于私人MSMQ来说,这很简单: private bool IsQueueEmpty(string path) { bool isQueueEmpty = false; var myQueue = new MessageQueue(path); try { myQueue.Peek(new TimeSpan(0)); isQueueEmpty = false; } catch (MessageQueueException e) { if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout) { isQueueEmpty = true; } } return isQueueEmpty; } 我如何对公共MSMQ进行同样的检查? 如果我尝试使用上面的代码检查公共MSMQ,它会在峰值上给我一个错误: System.ArgumentOutOfRangeException:Length不能小于零。

使用ReceiveById可怕的MSMQ性能

每秒只有20条消息! 这就是我得到的! 这是从队列中查看50条消息并使用ReceiveById并行接收它们的代码。 队列中的消息总数是500.我也测试了其他数字。 但是上限是每秒20条消息! 我在某处完全不受影响吗? 编辑1: 1 – 我需要队列可以恢复。 但有趣的是,即使我将可恢复选项设置为false; 仍然是上限是20消息/秒。 2 – 我被迫在这里使用MSMQ,因为涉及一些遗留应用程序。 但是如果这个代码是正确的并且这个前20个限制确实存在,我可以说服该组切换。 因此,任何推荐(基于实际经验)替换MSMQ都是非常受欢迎的(请注意,如果出现任何类型的失败,我们需要保留我们的消息)。 3 – 我已经将ThreadPool中的线程数设置为高数,以防它有所帮助,但实际上在这段代码中它将导致创建100到200个线程。 我已经测试了从50到10000的不同数字,没有差异。 4 – 在每个任务中创建一个新的MessageQueue,因为ReceiveById不是线程安全的。 5 – 正如人们在代码中看到的那样,消息大小非常低; 它只是一个字符串加一个int。 编辑2:[ 非常奇怪的新结果 ] 我已经玩了这段代码的每一点,发现了这个:如果我注释掉行singleLocal.UseJournalQueue = false; 在我的任务中,我每秒最多可以读取1200条消息。 不令人印象深刻,但在我的情 奇怪的部分是UseJournalQueue的默认值为false; 为什么再次将其设置为false应该会在性能上产生这样的差异? static partial class Program { static void Main(string[] args) { ThreadPool.SetMaxThreads(15000, 30000); ThreadPool.SetMinThreads(10000, 20000); var qName = […]

MSMQ没有调用COM

我用c#创建了一个COM对象,让VS为我注册。 我可以在注册表中看到它,如果我创建一个测试应用程序,我可以添加对它的引用,它可以按预期工作,所有方法都可用且function齐全。 现在如果我尝试在MSMQ规则中使用它没有任何反应。 它不会被调用。 这是因为它是.NET程序集吗? 是因为我没有VS Pro吗? 你有什么想法吗?

在MultiThreading Service中听什么更好的方法?

我对MSMQ和.NET中的线程都相对较新。 我必须创建一个服务,通过TCP和SNMP,几个网络设备以及所有这些东西在专用线程中运行,以不同的线程监听,但是这里也需要从另一个应用程序监听MSMQ队列。 我正在分析另一个类似的项目,并使用下一个逻辑: private void MSMQRetrievalProc() { try { Message mes; WaitHandle[] handles = new WaitHandle[1] { exitEvent }; while (!exitEvent.WaitOne(0, false)) { try { mes = MyQueue.Receive(new TimeSpan(0, 0, 1)); HandleMessage(mes); } catch (MessageQueueException) { } } } catch (Exception Ex) { //Handle Ex } } MSMQRetrievalThread = new Thread(MSMQRetrievalProc); MSMQRetrievalThread.Start(); 但是在另一个服务(消息调度程序)中,我使用基于MSDN的异步消息读取示例 : public […]

System.Messaging – 为什么MessageQueue不提供异步版本的Send

有谁知道为什么System.Messaging不提供Send方法的异步版本来向队列发送MSMQ消息。 实际上有Peek和Receive方法的异步版本(通过Begin / End对可以转换为C#5 async awaitable方法),但是很明显没有提供BeginSend / EndSend方法,只是一个Send方法,在我看来像这是一个同步阻塞I / O调用。 我认为这不是System.Messaging的限制,而是System.Messaging正在使用的本机消息队列API(mqrt.dll)之一,它将重叠结构作为函数MQReceiveMessage的参数使用与IOCP重叠的I / O虽然函数MQsendMessage没有采用这样的结构,所以看起来它是一个纯粹的同步调用。 我的问题仍然存在,任何人都会知道为什么MessageQueue API不提供向队列发送消息的异步方式?

CPU未得到充分利用。 由于阻塞I / O?

我试图找到C#服务器应用程序瓶颈未充分利用的地方。 我认为这可能是由于磁盘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 VM,虽然我的个人机器上是2ms左右)当我运行相同的工作台时,我只能达到~55%的CPU(当我在机器上运行相同的工作台时没有向队列发送响应消息我达到~90%CPU )。 我真的不明白这里有什么问题。 似乎很清楚,向队列发送消息是问题并且减慢了程序的全局处理(以及要处理的消息的队列化),但为什么会考虑我使用Task.Run来启动每个出列消息的处理并最终响应发送,我不希望CPU未被充分利用。 除非一个线程正在发送消息时阻止其他线程在等待返回(磁盘写入)时在同一个核心上运行,在这种情况下,考虑到延迟远远高于我的个人计算机,它可能是有意义的,但是一个线程等待I / O不应该阻止其他线程运行。 我真的想了解为什么我没有达到这台机器至少95%的CPU使用率。 我盲目地说这是由于较差的磁盘I / O性能,但我仍然不明白为什么它会导致CPU利用不足,因为我正在使用Task.Run同时运行处理。 它也可能是一些与磁盘完全无关的系统问题,但考虑到MessageQueue.Send似乎是问题,并且此方法最终将消息写入内存映射文件+磁盘,我看不出性能问题可能来自何处除了磁盘。 当然,由于程序最大限度地提高了我自己计算机上的CPU使用率,因此确实存在系统性能问题,但我需要找到VM系统上的瓶颈,以及为什么它会影响我的应用程序的并发/速度。 任何的想法 ?

如何使用MSMQ发送/接收多播消息?

有人可以帮我找到一些示例代码,使用MSMQ使用您选择的任何.NET语言发送和接收多播消息。 我四处搜索,有点看到发送是: MessaegQueue topic = new MessageQueue(“formatname:multicast=234.1.1.1:8081”) topic.Send(“Hello out there”) 我尝试用Receive做同样的想法: MessageQueue topic = new MessageQueue(“formatname:multicast=234.1.1.1:8081”) topic.Receive(); 但我一无所获。 任何人都可以展示如何接收多播消息的示例代码吗? 还是我发错了?

MSMQ发送消息到远程队列

我正在尝试将消息发送到远程队列。 我的进程没有失败,但我仍然没有看到远程队列上的消息? 如果它无法处理消息,我会认为它会失败? 我注意到在我的本地计算机上远程队列列在Outgoing队列中,但是也没有看到消息。 这里非常无知,所有的例子都表明我正在做的事情(或者我认为)是正确的。 代码(简单测试): using (var transaction = new TransactionScope()) { using (var queue = new MessageQueue(@”FormatName:DIRECT=OS:mymachine\MyQueueQueue”)) { XDocument xdoc = XDocument.Parse(“”); var message = new Message(xdoc.ToString()); queue.Send(message, MessageQueueTransactionType.Single); } transaction.Complete(); } Console.Read(); } 我做错了什么? 奇怪……没有错误,但在任何地方都看不到消息。 写入工作到我的本地队列。