【问题标题】:Edit MSMQ messages in a queue编辑队列中的 MSMQ 消息
【发布时间】:2012-03-27 03:09:45
【问题描述】:

我需要能够编辑我的错误队列中的消息(以便它们可以重新发送到实际队列进行重新处理)。

我想制作自己的自定义工具来执行此操作(因为我的消息需要特定格式才能让支持人员轻松阅读)。

我知道这是可能的,因为应用程序“QueueExplorer”会这样做。

有谁知道我如何加载 MSMQ 消息(不是队列中的第一个消息)、编辑它并将其保存回队列?

【问题讨论】:

  • 附带说明:我通常只会购买 QueueExplorer,但它不允许我的消息以对我的用户可用的方式进行格式化。我还需要集成将消息返回原始队列的功能。最后,对于非常简单的任务,QueueExplorer 速度非常慢。
  • 这可能不会很流行,但如果 QueueExplorer 是用 .NET 编写的(看起来确实如此),为什么不直接通过反编译器运行它,看看他们是如何做到的?
  • @Vaccano QueueExplorer 说 当您加载、复制、拖放或编辑消息时,它将进入队列末尾。(参见 cogin.com/mq/qelimitations.php)所以基本上他们会加载消息,并在编辑后删除原始消息并将已编辑的消息排入队列。如果那是您所追求的,他们不会进行“就地编辑”...
  • @Yahia - 这就是我想要的......看起来好像不可能:(
  • @Vaccano 您可以编写一个工具,将消息从错误队列中取出,通过将其呈现给编辑它的用户来“处理”它,然后将其排入“实际处理队列”。 . 不需要“就地编辑”,也不需要访问不是第一个消息的消息......这不是你需要的吗?

标签: c# msmq nservicebus


【解决方案1】:

MSMQ 消息应该是不可变的。您能做的最好的事情就是阅读消息并将经过编辑的消息副本发送回队列。

【讨论】:

    【解决方案2】:

    使用类似这样的方式遍历消息:

    List<Message> msgList = new List<Message>();
    
    using (MessageEnumerator me = queue.GetMessageEnumerator2())
    {
      while (me.MoveNext(new TimeSpan(0, 0, 0)))
      {
         Message message = me.Current;
         msgList.Add(message)
      }
    }
    

    然后您可以遍历列表,处理每条消息。 在原始消息的基础上创建一条新消息。然后删除现有消息,并添加新消息。

    foreach (Message message in msgList)
    {
      //Create a new message as required, add it, then remove the old message
      MessageQueue.ReceiveById(message.MessageId);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-01
      • 2012-12-28
      • 2010-12-10
      • 2017-06-29
      • 2018-02-20
      • 2017-11-11
      • 2015-01-24
      • 1970-01-01
      • 2012-02-12
      相关资源
      最近更新 更多