MessageQueue.Send偶尔会因InvalidOperationException,BadEnumerator而失败

时间:2011-01-17 18:44:26

标签: .net msmq system.messaging

我有一个非tx队列,在一个进程中有一个接收器和一个PowerShell脚本,它使用MessageQueue.Send(object,label)方法来排队消息。 偶尔我会在PowerShell脚本(发件人)中收到这个奇怪的错误:

An error occurred while enumerating through a collection: Message that the cursor is   currently pointing to has been removed from the queue by another process or by another call to Receive without the use of this cursor..
+ CategoryInfo          : InvalidOperation: (System.Messaging.MessageEnumerator:MessageEnumerator) [], RuntimeException
+ FullyQualifiedErrorId : BadEnumeration

我无法理解MessageEnumerator如何参与发送部分?有线索吗?

接收部分(.net中使用System.Messaging与MSMQ交互编写的服务)正在while循环中执行其工作,在该循环中它执行queue.Peek(1s超时)然后调用queue.Receive ()。 接收器记录所有MSMQ异常,但日志为空。发送PowerShell脚本时会发生所有错误。

接收器是旧的已知工作代码,但脚本是新的且未经测试。 在我的测试过程中,我没有在测试机器上出现任何错误,没有接收器被连接起来。

连接接收器的第一个镜头,对MessageQueue.Send()的一些调用导致错误。

该脚本看起来像这样:

begin {
    $q = Create-QueueInstance
}
process {
    $messagesToSend | %{
        Send-Message $q $_
    }
}
end {
    $q.Dispose()
}

第二次拍摄我尝试在每次迭代中处理队列实例,如果问题与共享资源没有被释放有关等等:

该脚本看起来像这样:

process {
    $messagesToSend | %{
        $q = Create-QueueInstance
        Send-Message $q $_
        $q.Dispose()
    }
}

错误仍然存​​在,但我相信它的发生频率较低。

我使用默认构造函数来创建队列intance,没有自定义DefaultPropertiesToSend或任何东西。 消息是XML可序列化的对象,产生大约300字节的消息体。 队列,发送方和接收方都位于同一台机器上。

1 个答案:

答案 0 :(得分:0)

为什么服务会进行Peek-then-Receive?
它是否检查消息是否是它想要的消息?
如果是这样,你是否使用PeekNext向下移动队列?
接收器服务是多线程的吗?
只是想弄清楚光标进入的地方。

非常奇怪的问题。

干杯 John Breakwell