Azure 服务总线 - 留言
Posted
技术标签:
【中文标题】Azure 服务总线 - 留言【英文标题】:Azure Service Bus - Leave message 【发布时间】:2021-12-30 11:22:24 【问题描述】:(仅供参考 - 我是新的 ASB)
关于 Azure 服务总线的几个问题:
您如何从队列中获取消息但将其留在那里直到其 TTL 过期?我原以为只是不调用 CompleteMessageAsync 就可以做到这一点,但无论如何它似乎都会被删除。
如何从队列中获取消息,但只有在特定接收者收到时才出队(删除)?
Message.ApplicationProperties["ReceiverId"].ToString() == "123" // 现在你可以删除它了
谢谢
【问题讨论】:
【参考方案1】:如何从队列中获取消息但将其保留在那里直到其 TTL 过期?
您可以查看消息而不是接收消息。问题是邮件将一次又一次地被拾取,直到传递计数超过最大值并且邮件将死信,这是您不希望发生的。我会回顾一下你在这里想要实现的目标,因为它是一个矛盾的设置。您希望消息有一个 TTL 以防止它被拾取,但是您希望在 TTL 继续过期之前对其进行探测。
如何从队列中获取消息,但只有在特定接收者收到时才出队(删除)?
我的建议是不要为此使用队列。如果您以特定目的地为目标,请使用您的实体拓扑来表达它。例如:发布关于某个主题的消息,并根据订阅者标识进行不同的订阅。这样您就可以为特定订阅者提供消息,其中逻辑订阅者可以横向扩展。
【讨论】:
【参考方案2】:1-使用 PeekMessage:
您可以查看队列中的消息,而无需将它们从队列中删除 通过调用 PeekMessages 方法来处理队列。如果你没有通过 maxMessages 参数的值,默认是偷看一个 消息。
//-------------------------------------------------
// Peek at a message in the queue
//-------------------------------------------------
public void PeekMessage(string queueName)
// Get the connection string from app settings
string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
// Instantiate a QueueClient which will be used to manipulate the queue
QueueClient queueClient = new QueueClient(connectionString, queueName);
if (queueClient.Exists())
// Peek at the next message
PeekedMessage[] peekedMessage = queueClient.PeekMessages();
// Display the message
Console.WriteLine($"Peeked message: 'peekedMessage[0].Body'");
https://docs.microsoft.com/en-us/azure/storage/queues/storage-dotnet-how-to-use-queues?tabs=dotnet
2-你也可以使用PeekMessage,检查你想要的属性(ReceiverId),如果是正确的,只需完成消息:
// ServiceBusReceiver
await receiver.CompleteMessageAsync(receivedMessage);
【讨论】:
以上是关于Azure 服务总线 - 留言的主要内容,如果未能解决你的问题,请参考以下文章