在接收之前查看消息

时间:2015-04-09 18:20:55

标签: azure servicebus azure-servicebus-queues

我是Azure的新手,并且学习了可以&过去几周的服务巴士。

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

只有相关ID匹配时,我才会继续接收消息。但是,为了使用messageSequencenumber接收消息,我了解到我必须首先推迟消息,将消息存储在列表或其他内容中,然后使用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.

1 个答案:

答案 0 :(得分:1)

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

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