【问题标题】:Remote MSMQ connection apparently lost problem when MSMQ server rebootsMSMQ 服务器重新启动时,远程 MSMQ 连接显然丢失了问题
【发布时间】:2011-09-04 20:52:41
【问题描述】:

我正在 Windows 服务中连接到远程 MSMQ,并按如下方式执行 BeginReceive:

msmq.ReceiveCompleted += new ReceiveCompletedEventHandler(Process);
msmq.BeginReceive();

Process 方法获取消息并像这样调用 EndReceive:

message = msmq.EndReceive(asyncResult.AsyncResult);

然后处理消息,然后像这样再次调用 BeginReceive:

msmq.BeginReceive();

问题在于,由于某种原因,当 MSMQ 服务器重新启动时,Process 方法会触发,并到达 EndReceive 行,然后引发 MessageQueueException。远程服务器重新启动后,在我重新启动 Windows 服务之前,不会再收到和处理任何消息。

在我看来,ReceiveCompletedEventHandler 方法(进程)正在触发,以及为什么在远程服务器重新启动后没有收到更多消息 - 我不太确定如何确保在重新启动后重新建立连接。

有人知道为什么会这样吗? (以及如何解决它?)。

注意 - 我现在添加了一些代码来处理 EndReceive 调用引发此特定错误时的情况,并再次循环调用 BeginReceive()(使用 Thread.Sleeps)直到没有任何错误更多的。令人讨厌的是,即使在 MSMQ 服务器备份并且 BeginReceive 似乎工作(即不抛出任何错误)时这似乎工作,仍然没有收到任何消息。

【问题讨论】:

    标签: c# windows-services connection msmq reboot


    【解决方案1】:

    我似乎已经解决了这个问题。我采取了以下步骤:

    1) 我现在将 BeginReceive 调用移到了一个单独的方法中,该方法循环调用 BeginReceive() 直到不再有异常(在这之间睡 X 秒)。

    2) 将 EndReceive 调用包装在 try catch 中,以捕获在 MSMQ 服务器重新启动时调用 ReceiveCompletedEventHandler 并抛出 MessageQueueException 的奇怪情况。

    3) 在捕获中,我在消息队列上调用 Close()。这个很重要,没有这个就不行了,然后我再调用我的 BeginReceive 方法。

    【讨论】:

      【解决方案2】:

      我似乎有类似的问题,但问题似乎在于底层 msmq 对象已失去与队列的连接。正在尝试使用 Refresh() 方法...

      【讨论】:

      • 这应该是评论而不是答案。
      猜你喜欢
      • 2015-03-20
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      相关资源
      最近更新 更多