【问题标题】:Process only some messages from a message queue只处理消息队列中的一些消息
【发布时间】:2012-08-09 20:38:42
【问题描述】:

我有一个消息队列,我在其中添加了一些电子邮件。 我想提取所有电子邮件,检查添加日期和优先级,然后只发送其中一封。 我读过这样的消息:

private IList<Email> GetEmailsFromQueue(MessageQueue queue)
{
    queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(Email) });
    IList<Email> emails = new List<Email>();
    Cursor cursor = queue.CreateCursor();
    Message m = PeekWithoutTimeout(queue, cursor, PeekAction.Current);
    if (m != null)
    {
        emails.Add((Email)m.Body);
        while ((m = PeekWithoutTimeout(queue, cursor, PeekAction.Next)) != null)
        {
            emails.Add((Email)m.Body);
        }
    }
    return emails;
}

private Message PeekWithoutTimeout(MessageQueue q, Cursor cursor, PeekAction action)
{            
    Message msgFromQueue = null;
    try
    {
        msgFromQueue = q.Peek(new TimeSpan(1), cursor, action);
    }
    catch(MessageQueueException ex)
    {
        if (!ex.Message.ToLower().Contains("timeout"))
        {
            throw;
        }
    }
    return msgFromQueue;
}

Receive 方法将从队列中删除消息。 有什么方法可以只读取和删除一些消息吗?

LE:我可能想到的一种解决方案是为每条消息添加一个 id,并使用 ReceiveById

还有什么建议吗?

【问题讨论】:

  • 也许 nservicebus 是您的选择? nservicebus.com 这是一个围绕 MSMQ 的框架,它通过队列发送消息并使用处理程序来处理特定消息。
  • 你能解释一下你为什么要这样做有什么方法可以只读取和删除一些消息吗?

标签: c# .net msmq


【解决方案1】:

有什么方法可以只读取和删除一些消息吗?

我从未使用过 MSMQ(反正也没有生气),但我认为您应该能够结合使用 PeekReceiveById 方法。

因此,您将继续在队列中使用Peek 以查看可用的消息,然后在您决定删除消息后使用ReceiveById 处理/从队列中删除。

除此之外,也许另一个选择是使用 2 个队列。第一个用于所有入站消息,第二个用于添加您想要保留的消息。

回到你的例子(假设我理解你想要达到的目标)

  • 第一个是您按所述处理的入站电子邮件提取所有电子邮件,检查它们的添加日期及其优先级
  • 第二个是用于您的出站电子邮件,即一旦您有了要发送的电子邮件,就将其推送到出站队列

【讨论】:

  • 这种方法比为每个帐户/频道/用户创建单独的队列更可取吗?
  • 不是 100% 确定你的意思,但我怀疑多个队列提供了很大的灵活性——偷看/接收方法也留下了不确定性;因为您永远无法确定消息是否已被处理 - 相反,入站队列清楚地表明消息仍需要处理,而出站队列清楚地表明它们“已”被处理
猜你喜欢
  • 2015-12-16
  • 2020-02-17
  • 2014-06-22
  • 2015-12-10
  • 2012-10-17
  • 1970-01-01
  • 2023-02-10
  • 2020-01-20
  • 1970-01-01
相关资源
最近更新 更多