1

我是 Azure 的新手,在过去的几周里学习了 can & service 总线。

我正在尝试从 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.
4

1 回答 1

1

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

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

于 2015-05-20T12:16:47.500 回答