【问题标题】:Msmq .NET api MessageQueue.Send does not throw where expectedMsmq .NET api MessageQueue.Send 没有在预期的地方抛出
【发布时间】:2014-07-18 19:26:59
【问题描述】:

我对 Msmq 还很陌生,我不了解交易的工作方式。

所以,假设我有一个事务队列,我向它发送了一条消息,但没有指定该方法不会抛出的任何事务,并且消息无处可去。文档说 -

'如果使用此重载将消息发送到事务队列,则消息将发送到死信队列'。

但是我在系统队列中的任何地方都看不到该消息。

这是供参考的代码 -

  var path = @".\private$\transactionalQ";
  if (MessageQueue.Exists(path))
    MessageQueue.Delete(path);
  var q = MessageQueue.Create(path, false);

  q.Send("non transactional message");

在将事务性消息发送到非事务性队列时,我看到了类似的行为。

如果我做了一些意想不到的事情,我希望方法调用会抛出。我错过了什么吗?

【问题讨论】:

  • MSMQ 旨在在目的地暂时无法到达时工作。在 MSMQ 放弃并将其移动到死信队列之前,该消息会在传出队列中停留一段时间。我忘记了默认超时时间,但它是几小时,而不是几秒。
  • 谢谢,这很有道理,我在哪里可以看到这个传出队列,我在 compmgmt 管理单元中看不到它。
  • 本地发送时没有外发队列。
  • 谢谢。越来越好奇......所以如果我向本地队列发送消息,并且发送和队列之间的事务模式不兼容,那么消息是否会丢失?
  • 要让消息最终进入死信队列,您需要启用负源日志。如果您不想保留消息,MSMQ 会丢弃错误消息。

标签: c# .net msmq


【解决方案1】:

你做对了,但在 MessageQueue.Send 方法中没有任何工具可以区分过渡消息和非过渡消息。 MessageQueue.Send(Object) 方法不会为单个参数而不是对象重载(我的意思是任何专门的类型)所以解决方案是你必须首先检查消息格式是否正确,然后你必须将它传递给队列。 此外,只有一个与发送方法相关的异常是 MessageQueueException ,它是由于您提供的路径无效以及访问消息队列 API 时发生错误而产生的。 欲了解更多信息,您可以通过this link 还有MSDN article

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2013-11-16
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多