Azure 服务总线 - 留言

Azure Service Bus - Leave message

(仅供参考 - 我是新 ASB)

关于 Azure 服务总线的几个问题:

  1. 如何从队列中获取消息但将其保留在那里直到其 TTL 到期?我本以为只要不调用 CompleteMessageAsync 就可以做到这一点,但无论如何它似乎都会被删除。

  2. 如何从队列中获取消息,但仅在特定接收方接收到消息时才将其出队(删除)?

Message.ApplicationProperties["ReceiverId"].ToString() == "123" // 现在你可以删除它了

谢谢

1-使用 PeekMessage:

You can peek at the messages in the queue without removing them from the queue by calling the PeekMessages method. If you don't pass a value for the maxMessages parameter, the default is to peek at one message.

//-------------------------------------------------
// 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);

How do you get a message from a Queue but leave it there until its' TTL expires?

您可以查看消息而不是接收消息。问题是消息将被一次又一次地提取,直到传递计数超过最大值并且消息将成为死信,这是您不希望发生的。我会回顾一下你在这里想要实现的目标,因为它是一个矛盾的设置。您希望消息有一个 TTL 以防它未被接收,但随后您想要探测它直到 TTL 持续到期。​​

How do get a message from a Queue, but only dequeue (remove) it when received by a specific receiver?

我的建议是不要为此使用队列。如果您以特定目的地为目标,请使用您的实体拓扑来表达它。例如:发布关于某个主题的消息,并根据订阅者标识进行不同的订阅。这样您就可以为特定订阅者发送消息,其中可以扩展逻辑订阅者。