当前位置:  开发笔记 > 编程语言 > 正文

MessageReadPropertyFilter在使用MSMQ时重置

如何解决《MessageReadPropertyFilter在使用MSMQ时重置》经验,为你挑选了1个好方法。

奇怪的一个.我们有一个多线程应用程序,它从MSMQ队列中提取消息,然后根据消息执行操作.所有这些都是使用DTC完成的.

有时,由于某些原因我无法描述,我们在将消息从队列中拉出时会收到消息读取错误.

应用中使用的代码:

Message[] allMessagesOnQueue = this.messageQueue.GetAllMessages();

foreach (Message currentMessage in allMessagesOnQueue)
{
    if ((currentMessage.Body is IAMessageIDealWith))
    {
                // do something;    
    }
}

访问currentMessage.Body时,有时会抛出异常:

System.InvalidOperationException:接收消息时未检索到Property Body.确保正确设置了PropertyFilter.

现在 - 这只在某些时候发生 - 看起来好像队列中的MessageReadPropertyFilter将Body属性设置为false.

至于它是如何变得像这有点神秘.Body属性是默认值之一,我们absolutley从未明确地将其设置为false.

有没有其他人看到这种行为或有一些想法为什么这个值被设置为假?



1> 小智..:

如前所述,您可以通过属性在System.Messaging.MessagePropertyFilter对象上可以访问的对象上显式设置布尔值.messageQueueMessageReadPropertyFilter

如果您希望在收到或达到峰值时从消息中提取所有数据,请使用:

this.messageQueue.MessageReadPropertyFilter.SetAll(); // add this line
Message[] allMessagesOnQueue = this.messageQueue.GetAllMessages();
// ...

这可能会影响阅读许多消息的性能,因此如果您只想要一些其他属性,请MessagePropertyFilter使用自定义标志创建一个新的:

// Specify to retrieve selected properties.
MessagePropertyFilter filter= new MessagePropertyFilter();
filter.ClearAll();
filter.Body = true;
filter.Priority = true;
this.messageQueue.MessageReadPropertyFilter = filter;
Message[] allMessagesOnQueue = this.messageQueue.GetAllMessages();
// ...

您还可以使用以下命令将其重置为默认值:

this.messageQueue.MessageReadPropertyFilter.SetDefaults();

更多信息:http://msdn.microsoft.com/en-us/library/system.messaging.messagequeue.messagereadpropertyfilter.aspx

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有