【发布时间】: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