【问题标题】:Peek Message before Receiving在接收之前查看消息
【发布时间】:2015-04-09 18:20:55
【问题描述】:

我是 Azure 的新手,过去几周学习了 can & service bus。

我正在尝试从 Azure 服务总线队列中读取消息。 QueueClient 接收方法会将消息从队列中拉出,我最初不想这样做。因此,我使用 Peek() 方法在 while 循环中一次浏览队列中的所有消息。然后我将消息的correlationId与我在本地数据库表中内部维护的Correlation Id进行比较。

仅当相关 ID 匹配时,我才会继续接收消息。但是,为了使用 messageSequencenumber 接收消息,我了解到我必须先延迟消息,获取存储在列表或其他东西中的 messageid,然后使用 QueueClient Receive() 方法接收消息,最后将消息标记为完成。

但由于我正在使用 Peek() 浏览消息,所以这不允许我推迟消息。我被困在这里使用 messageId 接收消息。

我也不能在收到之前完成一条消息。

您能建议任何方法来实现这一点吗?

BrokeredMessage message = new BrokeredMessage();
message = null;

while ((message = reader.Peek()) != null && row_count > 0)
{

List<long> deferredMessageReceipts = new List<long>(); 

// Read Ping results table to get the rows with no msg_recv_ts

logobj.Categories.Clear();
logobj.Categories.Add("INFO");
logobj.Message = "Reading ! Message: " + " Correlation ID:" +      message.CorrelationId;
Logger.Write(logobj);

if (message != null)
{

if (PRTA_rows.Corr_id == message.CorrelationId) //compare correlation ids 
 {
  DateTime ping_recv_ts = DateTime.Now;
  logobj.Categories.Clear();
                            logobj.Categories.Add("INFO");

 string messageBody = message.GetBody<string>();
 logobj.Message = "Ack Message Found ! Message Body: " + messageBody + "       Correlation ID:" + message.CorrelationId;
 Logger.Write(logobj);
 string msg_type = "PING_ACK";
 logobj.Categories.Clear();
                            logobj.Categories.Add("INFO");
 logobj.Message = "Marking Message as complete...";
 Logger.Write(logobj);


 // Deferring a message
 message.Defer(); // Getting error here "The operation cannot be completed      because the ReceiveContext is null."

 long msg_seq_nbr=message.SequenceNumber;

 reader.Receive(msg_seq_nbr); // This operation is not possible without    deferring the message.

 message.Complete();

   }


   }
   }  // End while browsing messages.

【问题讨论】:

  • 队列中的消息与本地数据库有什么联系?我试图理解为什么您需要查找要处理的特定消息,而不是在收到消息时按顺序处理来自队列的消息(毕竟这是一个队列)。
  • 我正在浏览的队列是多个应用程序使用的通用队列。所以我不想收到其他消息。当我将消息发送到队列时,我会在消息中附加一个唯一的 guid 并在数据库表中跟踪它。因此,当我读取队列时,使用 PEEK 方法搜索所有消息以查看我的消息是否存在于队列中。如果我找到我的消息然后我会收到它,如果我开始按顺序接收每条消息,它将增加传递计数。所以我使用 peek() 来查看 guid 是什么,并且只有当那是我的消息时才接收消息,
  • 似乎无法在没有接收的情况下查看和完成消息。考虑更改您的体系结构以将多个队列用于不同类型的消息。或者通过 CorrelationId 过滤器使用主题和多个订阅者。
  • 这就是我最终的结果.. 但是字体肯定知道.. 你能确认一下.. 如果可能的话..

标签: azure servicebus azure-servicebus-queues


【解决方案1】:

我认为您应该重新考虑您的设计,因为这不是您通常使用排队系统的方式。当您需要时间解耦、负载平衡和先进先出时使用。

您可能需要考虑使用 Servicebus 主题并为每个应用程序设置订阅者。主题类似于队列,但使用 Pub\Sub 模型。您可以使用 Topic\Subscription 中的过滤器将消息路由到正确的订阅。所有应用都会“发布”到一个主题,并且您将拥有每个应用的订阅。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2013-12-26
    • 2014-02-06
    • 1970-01-01
    • 2012-10-19
    相关资源
    最近更新 更多