【问题标题】:MessageQueue.Send occasionally fails with InvalidOperationException, BadEnumeratorMessageQueue.Send 偶尔会因 InvalidOperationException、BadEnumerator 而失败
【发布时间】:2011-06-10 15:21:17
【问题描述】:

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

【问题讨论】:

    标签: .net msmq system.messaging


    【解决方案1】:

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

    很奇怪的问题。

    干杯 约翰·布雷克韦尔

    【讨论】:

    • 1.我真的不知道,但如果消息处理失败,我相信它是一个守卫。 2. 它不是检查消息,这个过程实际上是 Peek-Process-Receive 3. 不,它正在使用这个调用: queue.Peek(new TimeSpan( 0, 0, 1 ) ) 4. 嗯,是的。它是一个启动线程的 Windows 服务,但该线程是唯一一个从队列中消费消息的线程。感谢您提出的所有好问题!
    • 是的,Peek-then-receive 是在旧版本的 MSMQ 中出现故障时处理消息的经典方式。不过,您应该在 MSMQ 4.0 或更高版本上使用事务接收。
    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2020-08-08
    • 2018-11-23
    相关资源
    最近更新 更多