两次接收相同的MSMQ消息?

时间:2009-06-02 15:56:56

标签: c# .net msmq message-queue

我有一个基于MSMQ的系统,它有三层相互通信。为简单起见,我将它们称为第1层,第2层和第3层。它们就像这样:

Layer 1 <-> Layer 2 <-> Layer 3

因此,第1层仅与第2层通信,第3层仅与第2层通信,第2层与第2层通信。我有四个队列,

Layer1_in
Layer1_out
Layer3_out
Layer3_in

这些层通过此基础架构进行通信:

Layer 1 -> Layer1_out -> Layer 2
Layer 1 <- Layer1_in <- Layer 2
Layer 3 -> Layer3_out -> Layer 2
Layer 3 <- Layer3_in <- Layer 2

(对不起,如果这比必要的更详尽)

无论如何,消息从第1层传递到第2层,发生了一些处理,然后另一条(相关)消息被发送到第3层,反之亦然。我遇到的问题是,偶尔我有两条消息从第1层发送到第2层,但不是接收两条消息,而是接收第一条消息两次。我在BeginReceive上使用Layer1_out来异步接收消息。完成后,我处理收到的消息并再次呼叫BeginReceive以获取下一条消息。

为了跟踪此情况,我在发送端实现了一个消息计数器,并将其写入文本文件。我正在使用Extension属性来存储此消息编号的字符串表示,以便我可以在处理端检索消息编号。当我收到消息时,我将这个号码写入另一个文件。这应该生成两个具有相同内容的文件,但我会看到像

这样的东西
00000000000000000214
00000000000000000215
00000000000000000215 <- this is bad!
00000000000000000217
00000000000000000218
00000000000000000219

在收据日志中,表示消息215已处理两次,216未通过。出于我的目的,它对我来说两次处理相同的消息没有任何影响(因此有一段时间没有注意到这一点),但完全错过了一个消息是个大问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

问题已经解决了...有一天我会发出多线程建议,然后在接下来的一次违规行为中被咬伤!

罪魁祸首是这条线:

receiveResult = <queueName>.BeginReceive()

当我有另一条消息已在队列中等待时,我的ReceiveCompleted事件在另一个线程上触发,并且在EndReceive(receiveResult)的返回值实际写入之前进入BeginReceive调用到receiveResult变量。结果,我使用相同的值调用EndReceive并再次收到相同的消息!将整个事件处理程序锁定在同步对象周围可以解决问题。