我有一个非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字节的消息体。 队列,发送方和接收方都位于同一台机器上。
答案 0 :(得分:0)
为什么服务会进行Peek-then-Receive?
它是否检查消息是否是它想要的消息?
如果是这样,你是否使用PeekNext向下移动队列?
接收器服务是多线程的吗?
只是想弄清楚光标进入的地方。
非常奇怪的问题。
干杯 John Breakwell