使用MSMQ和SQL Server的分布式事务,但有时会出现脏读的情况
我们的SQL Server 2014数据库设置为READ_COMMITTED_SNAPSHOT. 我们使用MSMQ和分布式交易(我们使用MassTransit 2.10) 在系统的一个部分中,我们从队列中读取一条消息,进行数据库更新,然后向队列发布新消息(全部在单个事务下). 我们发现了一种情况,即处理下一个消息时似乎不进行更新(从同一表读取第一部分更新),即使我希望该消息仅在排队中同时,数据库已更新.当我们稍后查询表时,将按预期进行更新的数据.这似乎只有在我们的负载高且很少时才会发生. 我们代码的简化版本 // code that processes message 1 using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions() { Timeout = TimeSpan.FromMinutes(30), Isolat
0 2024-04-21
编程技术问答社区
在多线程服务中,什么是更好的倾听方式?
我对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); }
0 2024-04-21
编程技术问答社区
如何检查公共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)
0 2024-04-21
编程技术问答社区
如何将一个msmq消息移到一个子队列中?
使用System.Messaging类,如何将MSMQ消息(在这种情况下为毒药消息)移至子标题? 似乎很简单,但是我无法弄清楚. 解决方案 这似乎是不可能的. ayende 诉诸于无人管理的API ,如果他做不到,那我当然不能. 其他解决方案 在记录中,我今天刚刚通过同事了解 Microsoft最终添加了为4.0 .
0 2024-04-20
编程技术问答社区
我怎样才能获得MSMQ队列上的所有可用消息?
什么是在队列中获取当前所有消息的最佳方法? 我们有一个带有大量非常小的消息的队列,我想做的就是阅读所有当前消息,然后通过线程池发送它们进行处理. 我似乎找不到任何好的资源,这将向我展示如何创建一种简单的方法来返回iNenumerable,例如 谢谢 解决方案 尽管我同意 nick =" https://stackoverflow.com/users/87053/arsenmkrt"> arsenmkrt的解决方案将起作用,另一个选项涉及使用a messageenumerator 并将消息堆放到您的iEnumerable中. var msgEnumerator = queue.GetMessageEnumerator2(); var messages = new List(); while (msgEnumerator.MoveNext(new TimeSpan(0, 0, 1))) { var m
0 2024-04-20
编程技术问答社区
如何设置一个消息队列的所有者?
system.messaging.messagequeue类无法提供设置队列所有权的方法.如何编程设置MSMQ消息队列的所有者? 解决方案 简短的答案是p/调用Windows API函数 MQSetQueueSecurity void SetOwner(MessageQueue queue, byte[] sid, bool ownerDefaulted = false) { var securityDescriptor = new Win32.SECURITY_DESCRIPTOR(); if (!Win32.InitializeSecurityDescriptor(securityDescriptor, Win32.SECURITY_DESCRIPTOR_REVISION)) throw new Win32Exception(); if (!Win32.SetSecurityDescriptorOwner(securityDes
0 2024-04-20
编程技术问答社区
System.Messaging-为什么MessageQueue不提供异步版本的Send?
任何人都知道为什么system.sessaging不提供发送方法的异步版本以将MSMQ消息发送到队列. 实际上存在异步版本的peek和接收方法(通过可以转换为c#5 async等待方法的开始/结束对),但令人惊讶的是,没有提供的启动/终端方法,只是一种似乎是一种似乎是一种发送方法对我来说,这是一个同步的封锁i/o呼叫. 我认为这不是系统的限制,而是系统的本机消息队列API(mqrt.dll). i/o与iocp一起,而函数MQsendMessage则不采用这种结构,因此似乎是一个纯粹的同步呼叫. 我的问题仍然存在,任何人都会知道为什么MessageQueue API不提供异步向队列发送消息的方式? 解决方案 msmq文档指出,发送是"始终是异步操作".自从我与MSMQ合作以来已经有一段时间了,但是IIRC立即发送,该消息甚至在尝试通过网络发送之前将其冲洗到本地. . 所以,虽然不是 异步(它必须等待磁盘写入),但应该很快. 其他解决方案 您是对的
0 2024-04-20
编程技术问答社区
MSMQ CreateCursor NullReferenceException
我有一个网站,该网站在远程服务器上使用MSMQ排队等待电子邮件.我能够将消息写给队列,然后在队列上呼叫处置.队列仍然会收到消息,但是在某个时候,GC出现并试图清理,这会导致IIS崩溃.这就是我在事件日志中看到的: 异常:System.NullReferenceException 消息:对象引用未设置为对象的实例. stacktrace:at System.Messaging.Cursor.Finalize() 此代码已经运行了多年,但是最近才开始行动.我已经重新启动了所有服务器以对其进行故障排除,但这无济于事. 编辑1 这是发送消息的代码. QueueFactory只是一个单身人士,在创建MessageQueue的锁定周围. using (System.Messaging.MessageQueue queue = QueueFactory.Instance.BuildQueue(this.Path)) { System.Messa
0 2024-04-20
编程技术问答社区
是否有更好的方法来统计消息队列(MSMQ)中的消息?
我目前这样做: MessageQueue queue = new MessageQueue(".\Private$\myqueue"); MessageEnumerator messageEnumerator = queue.GetMessageEnumerator2(); int i = 0; while (messageEnumerator.MoveNext()) { i++; } return i; ,但出于明显的原因,感觉不错 - 我不必迭代每条消息才能获得数量,我应该吗? 有更好的方法吗? 解决方案 在C#中,答案似乎是否 - 您正在做的是这样做的唯一方法之一,而其他所有方法都是相似的. 有多种方法可以使用WMI或COM-查看 我找到了以下帖子,这些帖子可能会给您一些其他想法,以稍微更好的纯C#实现: 在在C# 的MSMQ MessageQueue中 虽然以上似乎都是正确的,但我应该注意,我从未尝试使用MSMQ进行此操作 - 我只从
0 2024-04-19
编程技术问答社区
带有事务回滚的MSMQ接收不能使消息再次可用
我在一个名为" MessagequeReceive"的类中有这个. public MessageQueueTransaction BlockingReceive(out Message message) { MessageQueueTransaction tran = null; message = null; tran = new MessageQueueTransaction(); tran.Begin(); try { message = Queue.Receive(new TimeSpan(0, 0, 5), tran); } catch (MessageQueueException ex) { // If the exception was a timeout, then just continue // otherwise re-raise it.
0 2024-04-19
编程技术问答社区
使用ReceiveById的MSMQ性能非常糟糕
每秒只有20个消息!这就是我所得到的!这是从队列中窥视50条消息的代码,并使用receedById并行接收它们.队列中的消息总数为500.我也测试了其他数字.但是最高限制是每秒20个消息!我是完全挡住的地方吗? 编辑1: 1-我需要队列才能恢复.但是有趣的部分是,即使我将可恢复的选项设置为false;仍然是最高限制是20消息/秒 2-我在这里被迫使用MSMQ,因为涉及一些旧应用.但是,如果此代码正确,并且此前20个限制确实存在,我可以说服组切换.因此,真正欢迎任何建议更换MSMQ的建议(基于实际经验)(请注意,在任何类型的失败时我们都需要持续存在消息). 3-我已经将线程池中的线程数设置为高数字,以防万一,但实际上在此代码中会导致100-200个线程.我测试了从50到10000的不同数字,没有差异. 4-在每个任务中,创建了一个新的MessageQueue,因为RecedById不是线程安全. 5-正如代码中可以看到的消息大小非常低;这只是一个字符串加
0 2024-04-19
编程技术问答社区
枚举MSMQ中的所有出站队列,C#语言
使用C#和.NET 3.5,如何在MSMQ中获取所有出发队列的列表?我找到了本文关于它 Microsoft Message Queue 3.0 Object Library ... 的com条目 > 那么,如何获得当前外发的队列列表?我认为必须有一种方法,因为我可以在Computer Management中看到它们... 我该怎么办? 解决方案 我认为这两个好地方是: http://msdn.microsoft. com/en-us/library/ms703173%28V = vs.85%29.aspx 我会看看是否可以使用一些代码. 也许不是,那些看起来很老,还在看. 引起了一些将向您展示的wscript,仍在寻找.NET代码: Dim Locator Set Locator = CreateObject("WbemScripting.SWbemLocator") Dim objs Set Service = Locator.
0 2024-04-18
编程技术问答社区
具有不同消息类型的消息队列
我正在调查Microsoft消息队列进行过程间跨网络消息传递.但是当我收到一条消息时,我不知道先验我要获得的对象类型,因此代码 queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(Wibble) }); 在我收到消息之前无法应用,因为我不知道它是否是Wibble.那么我如何收到不同的消息类型? 解决方案 您可能会考虑不将对象存储在MSMQ消息中,而是将其引用对其持久位置,如果可以的话. MSMQ在消息队列上有有限的空间,因此较小的消息是最好的. 如果您不能这样做,则可以使用您喜欢的任何序列化器将对象直接序列化为Bodystream.然后也存储类型名称,可能在消息标签中最好. 与此非常相似的东西(在此处刮擦,在此计算机上没有IDE),以及在出路上的相似动作: public void FormatObject(object toFormat, Message message) {
0 2024-04-18
编程技术问答社区
CPU未被充分利用。由于阻塞的I/O?
我正在尝试找到不足CPU的C#服务器应用程序的瓶颈.我认为这可能是由于磁盘i/o性能差,并且与应用程序本身无关,但是我很难用这种假设做出事实. 该应用程序从本地MSMQ队列中读取消息,对每个消息进行一些处理,然后处理消息后,将响应消息发送到另一个本地MSMQ队列. 我正在使用异步循环读取队列中的消息,尽可能快地排出它们,并使用任务派遣它们进行处理.lun以启动每个消息的处理(并且不等待此任务.仅将延续的错误连接到对数字错误).同时处理每个消息,即,在处理下一个消息之前,无需等待一条消息进行完全处理. 在消息的处理结束时,我正在使用messagequeue的发送方法(某种程度上异步,但不是因为它必须等待磁盘写入写入-See system.System.System.Messaging-为什么MessageQueue不提供发送send的异步版本 ). 对于基准测试,我在队列中排队100K消息(约100k消息的总尺寸为100MB),然后启动该程序.在我的两台个人计算机(
0 2024-04-18
编程技术问答社区
MSMQ Receive()方法超时
我前一段时间是我最初的问题是 msmq slow slow queue wording ,但是我已经高级从那时起,现在认为我知道这个问题要清晰一些. 我的代码(实际上是我正在使用的开源库的一部分),如下所示: queue.Receive(TimeSpan.FromSeconds(10), MessageQueueTransactionType.Automatic); 使用消息传递.问题如下. 上面的代码行将使用指定的超时(10秒)调用. Receive(...)函数是一个阻止函数,应该阻止,直到一条消息到达队列为止,它将返回.如果在暂停之前未收到消息,它将在超时返回.如果在调用函数时在队列中有消息,它将立即返回该消息. 但是,正在调用Receive(...)函数,看到队列中没有消息,因此等待新消息进入. ,它没有检测到这一新消息并继续等待.超时最终被击中,此时,代码继续并再次调用Receive(...),它拾取了消息并处理它. 现在,此问题仅在数天/周后
0 2024-04-18
编程技术问答社区
IIS中的WCF,在工作组模式下使用MSMQ
我一直在使用WCF尝试MSMQ,但是我似乎无法使其正常工作.我使用WCF和服务参考的客户端(将消息发送到队列)工作.这样做的代码或多或少是: static void Main(string[] args) { var client = new MsmqServiceReference.MsmqContractClient(); client.SendMessage("TEST"); client.Close(); Console.ReadKey(); } 当我添加服务参考时,MSMQContractClient是Visual Studio生成的代理. app.config中的端点指向msmqueue:
0 2024-04-18
编程技术问答社区
如何为MSMQ创建一个作为Windows服务的C#监听器服务
我首先要说我不是一个.NET开发人员,而是扔进了一个项目,我需要使用MSMQ,因此经典的ASP Web应用程序可以将消息发送到处理处理处理的C#Windows服务.我有将其他消息队列与其他语言整合在一起的经验,但是就像我提到的那样,我对.NET和Windows开发没有太多经验,因此对某些指导表示感谢. 这是我的问题... 有人可以提供一些基本的C#代码来听现有的MSMQ队列,并通过执行简单的事情(例如将当前时间戳写入日志文件或发送电子邮件)来响应新消息? 如何在Visual Studio .NET中打包此代码以创建和安装Windows服务? (应该是哪种类型的项目,等等.我正在使用Visual C#2010 Express.) 最后,我不确定我需要使用经典ASP的要求使用哪种版本和/或实现MSMQ.我认为COM版本是我需要的,但是我也阅读了有关新的WCF版本以及3.0和4.0之间的差异.有人可以给我指示我应该使用哪个版本? 非常感谢! 解决方案 您可
0 2024-04-18
编程技术问答社区
c#. MSMQ .单个消息的最大尺寸
使用 msmq 我想发送一条消息( 接近1 GB ).我想发送字节的数组.但是我只能发送 4 MB . 我如何解决这个限制? 解决方案 您知道,MSMQ中消息的最大大小为4MB,最好选择其他解决方案. 解决方案: 如果要传输超过此尺寸的数据,则必须将其剪切 进入发件人侧的块,然后在接收器侧重组. 为什么MSMQ消息有4MB限制? 查看这个博客. 如何使用Microsoft消息Queuing 发送大于4 MB的文件? 在这里 其他解决方案 您是否必须坚持使用纯MSMQ?如果您可以考虑切换到 nservicebus ,它具有称为 databus 可以有效地将大的有效载荷放在MSMQ之外,但将有效载荷与MSMQ消息联系起来. (根据我的经验,它也使使用MSMQ与C#更愉快.但是YMMV) 如果您不能使用nservicebus,则至少可以受到它的启发.生成一个随机文件名,将内容存储在两个端点都可以访问的共享上,在您的消息中包含文件名.
0 2024-04-18
编程技术问答社区
不能确定是否存在一个具有指定格式名称的队列。
执行以下代码时会得到异常.有什么想法怎么了? string queueName = "FormatName:Direct=TCP:1.1.1.1\\Private$\\test"; MessageQueue queue; if (MessageQueue.Exists(queueName)) queue = new System.Messaging.MessageQueue(queueName); else queue = MessageQueue.Create(queueName); queue.Send(sWriter.ToString()); 编辑: 这是stacktrace的异常消息和第一行 无法确定是否具有指定格式名称的队列 存在. at system.messaging.messagequeue.exists(string path) 顺便说一句,它适用于本地队列. 解决方案 从您的样本中,看起来您正在尝试检查是否存在远程私人队列
2 2024-04-18
编程技术问答社区
关于如何组织后台队列操作的文章
现在,我正在考虑如何组织系统体系结构.该系统将由网站组成,用户可以在其中上传一些文档,然后将其处理回去,并使用一些应处理文档的任务的背景守护程序. 我的问题是: 我应该在上面告诉您的守护程序,作为WCF服务,只有名为Pipes(不需要NetOwork访问此服务)? 关于此的任何建议/提示/建议? 数据用户可以提供的只是一堆XML文件. ASP.NET网站将公开功能以获取此XML文件,然后以某种方式将其传递给守护程序. 您能把我指出有关该主题的一些文章. 预先感谢! 发布编辑 几个小时后发现了人们在这里建议的MSMQ之后,我对技术的想法更适合分布式体系结构(处理节点位于单独的计算机上,并且通过网络在不同的计算机之间交换了消息). 目前不需要与独立机器分开.机器上将有一个ASP.NET网站和某些处理程序. 使用MSMQ是如此必要吗? 发布编辑#2 当我在此处使用.NET框架时,请仅建议提供.NET兼容的内容.确实没有任何选择.
0 2024-04-16
编程技术问答社区