无法通过 WCF 服务内的 MSMQ 发送对象

cannot send object over MSMQ inside WCF service

我有一些遗留代码可以通过 MSMQ 消息队列发送对象。它运行良好,但现在代码已移至 WCF 服务。现在突然达到限制并且 queue.Send 行抛出异常:

"Insufficient resources to perform operation".

我没有使用 netMsmqBinding,只是通过 MessageQueue 对象发送它,所以我不知道如何增加对象大小的配额。

MessageQueue queue = new MessageQueue(queueName);

using (MessageQueueTransaction tx = queue.Transactional ? new MessageQueueTransaction() : null)
{
    if (queue.Transactional)
    {
      tx.Begin();
    }

    Message msg = new Message();
    msg.Body = delivery;
    msg.Label = delivery.GetType().Name + " " + delivery.DeliveryId;
    msg.Formatter = new XmlMessageFormatter(new Type[] { typeof(Delivery) });
    msg.Recoverable = true;
    queue.Send(msg, tx);
}

在记录异常的服务上实现 IErrorhandler 之后,我在资源之前看到了这个:

12/10/2015 7:54:06 AM Uncaught exception of type System.TimeoutException was thrown. Message: 'The operation did not complete within the allotted timeout of 00:00:09.9970000. The time allotted to this operation may have been a portion of a longer timeout.'

我已经将客户端和服务的所有超时 (open/close/receive/send) 设置为 45 分钟,但仍然出现 10 秒超时错误。奇怪。

我能做什么?

可能的问题是您由于 1 个或多个原因达到了 MSMQ (~2GB) 的 storage/memory 限制。

  1. 邮件正在您的一个队列中累积,未被处理和删除。 (最有可能)
  2. 日记功能已打开。
  3. 死信队列已满。

您可以通过检查文件夹的属性来快速检查队列大小:%windir%\system32\msmq\storage

问题原因找到了,是我自己的错。 我已经从 Delivery 的两个最大成员中删除了 [XmlIgnore] 属性。由于 Delivery 是用 XmlMessageFormatter 序列化的,用于消息队列,对象对于队列来说太大了。

抱歉打扰了....