我是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.
答案 0 :(得分:1)
我认为您应该重新考虑您的设计,因为这不是您通常使用排队系统的方式。当您需要时间解耦,负载平衡并且先进先出时使用。
您可能需要考虑使用Servicebus主题,并为每个应用程序设置订阅者。主题类似于队列但使用Pub \ Sub模型。您可以使用Topic \ Subscription中的过滤器将邮件路由到正确的订阅。所有应用程序都会“发布”到一个主题,您将拥有每个应用程序的订阅。