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

时间:2015-12-09 15:00:21

标签: c# .net wcf msmq

我有一些遗留代码通过MSMQ消息队列发送对象。它工作正常,但现在代码被移动到WCF服务。现在突然达到限制并且queue.Send行抛出异常:

  

"没有足够的资源来执行操作"。

我没有使用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未被捕获的类型异常   抛出了System.TimeoutException。消息:'操作没有   在分配的超时00:00:09.9970000内完成。时间   分配给这个操作可能是一个更长的一部分   。超时'

我已将所有超时(打开/关闭/接收/发送)放在客户端和服务上45分钟,仍然会出现10秒超时错误。奇怪。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

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

抱歉打扰你......

答案 1 :(得分:0)

可能的问题是,由于一个或多个原因,您达到了MSMQ(~2GB)的存储/内存限制。

  1. 邮件正在您的某个队列中累积,并且未被处理和删除。 (最有可能)
  2. 日记功能已开启。
  3. Deadletter队列正在填补。
  4. 您可以通过检查文件夹的属性来快速检查队列大小:%windir%\system32\msmq\storage