2

我有一个非 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 字节的消息正文。队列、发送者和接收者位于同一台机器上。

4

1 回答 1

0

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

很奇怪的问题。

干杯约翰·布雷克韦尔

于 2011-01-17T22:18:48.117 回答