gpt4 book ai didi

c# - 是否有可能使用 MSMQ MessageQueue.Peek 超时丢失消息?

转载 作者:太空狗 更新时间:2023-10-29 22:35:12 26 4
gpt4 key购买 nike

我目前遇到丢失消息的问题。此错误很少发生,但经常发生,足以令人厌烦。以下是问题的背景:

  • 我已经在 goldmine_service_queue 上打开了消息日志,它是 Windows 2003 服务器上的一个 MSMQ。
  • 我可以证明该消息已被插入到 goldmine_service_queue 中,因为该消息出现在消息日志中。此信息提供有关消息何时消失的时间信息。
  • 日志功能使用http://logging.apache.org/log4net/index.html
  • 日志没有显示错误。
  • 辅助函数(如下所示)在 Windows 服务的线程中执行。它负责从队列中查看消息(工作项)并进行处理。
  • 根据日志,我强烈怀疑我的问题可能与 MessageQueue.Peek 和超时行为有关。

有没有可能超时和消息接收同时发生?有没有更好的方法来处理服务停止检查以帮助避免此错误?

        private void workerFunction()
{

logger.Info("Connecting to queue: " + Settings.Default.goldmine_service_queue);
MessageQueue q = new MessageQueue(Settings.Default.goldmine_service_queue);
q.Formatter = new ActiveXMessageFormatter();

while (serviceStarted)
{

Message currentMessage = null;

try
{
currentMessage = q.Peek(new TimeSpan(0,0,30));
}
catch (System.Messaging.MessageQueueException mqEx)
{
if (mqEx.ToString().Contains("Timeout for the requested operation has expired"))
{
logger.Info("Check for service stop request");
}
else
{
logger.Error("Exception while peeking into MSMQ: " + mqEx.ToString());
}
}
catch (Exception e)
{
logger.Error("Exception while peeking into MSMQ: " + e.ToString());
}

if (currentMessage != null)
{

logger.Info(currentMessage.Body.ToString());
try
{
ProcessMessage(currentMessage);
}
catch (Exception processMessageException)
{
logger.Error("Error in process message: " + processMessageException.ToString());
}

//Remove message from queue.
logger.Info("Message removed from queue.");
q.Receive();
//logPerformance(ref transCount, ref startTime);
}


}//end while

Thread.CurrentThread.Abort();

}

最佳答案

我认为基于快速审查不应遗漏任何消息,但您的工作方式非常奇怪,竞争条件范围很大。

为什么不直接接收消息并将其传递给 ProcessMessage(如果 ProcessMessage 失败,无论如何您都在执行读取)。如果您需要处理多个接收者,则在 MSMQ 事务中进行接收,以便其他接收者无法使用该消息,但在提交事务之前不会将其从队列中删除。

此外,为什么不执行异步接收并让线程池处理完成(您必须在此处调用 EndReceive),而不是轮询队列。这节省了线程的占用,并且您不需要特殊情况下服务关闭(关闭消息队列然后调用 MessageQueue.ClearConnectionCache();)。

此外,中止线程是一种非常糟糕的退出方式,只需从线程的启动函数返回即可。

关于c# - 是否有可能使用 MSMQ MessageQueue.Peek 超时丢失消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1901963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com