我有一个非 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 timeout),然后调用 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()
}
}
错误仍然存在,但我相信它发生的频率较低。
我使用默认构造函数来创建队列实例,没有自定义 DefaultPropertiesToSend 或任何东西。消息是 XML 可序列化对象,产生大约 300 字节的消息正文。队列、发送者和接收者位于同一台机器上。