【问题标题】:message queue storage limit on a single queue doesn't work?单个队列的消息队列存储限制不起作用?
【发布时间】:2013-10-30 18:03:04
【问题描述】:

Send() 队列满时不会抛出异常。

我有两个私有消息队列,比如 queue 和 queue1,我将 queue1 的消息存储设置为少量,比如 5120 kb,在我的程序中,当 queue1 已满而全局队列已满时,我将消息发送到 queue 和 queue1未满,queue1 上的 Send() 方法没有抛出异常,这是为什么呢?我期待 queue1 上的 send() 方法抛出异常,所以我知道它已满。

【问题讨论】:

  • 请说明发送者和队列是在同一台机器上还是不同机器上

标签: c# msmq


【解决方案1】:

我认为这是设计使然:

来自MSMQ FAQ

MQSendMessage() 总是成功,即使很明显 无法发送消息。为什么? MQSendMessage() 的成功并不 保证将消息传递到最终目的地。这 MQSendMessage() 的成功仅仅意味着本地 MSMQ 服务 成功接受消息,它会尽快处理 可能的。这并不意味着任何保证将消息传递给它的 目的地队列。交付失败的原因有很多 信息。例如:

  • 您尝试将非事务性消息发送到事务队列。
  • 您向已超出配额的队列发送消息。
  • 您向未授予您发送权限的队列发送消息。
  • 您使用 DIRECT 格式名称向不存在的计算机发送消息。

MQSendMessage() 按照设计在所有这些情况下都会成功。它是 拒绝此类消息的目标计算机。或者消息将 在传出队列中等待直到过期。

【讨论】:

  • 如果目的地是远程的。 Send 将在本地传出队列中创建消息,该队列对任何配额限制一无所知。如果目的地是本地的,那么 Send 应该尝试直接在本地队列中创建消息并失败。
  • @JohnBreakwell,如果队列是本地的,并且我在单个队列上设置了配额限制,当队列已满时,Send() 仍然无一例外地成功。
猜你喜欢
  • 2014-01-28
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
相关资源
最近更新 更多