(К вашему сведению - я новый ASB)

Несколько вопросов по служебной шине Azure:

  1. Как получить сообщение из очереди, но оставить его там , пока не истечет его TTL? Я бы подумал, что просто не вызвать CompleteMessageAsync, это сделает именно это, но, похоже, он удаляется, несмотря ни на что.

  2. Как получить сообщение из очереди, но исключить его из очереди (удалить) только тогда, когда оно получено конкретным получателем?

Message.ApplicationProperties ["ReceiverId"]. ToString () == "123" // теперь вы можете удалить его

Благодарность

0
user2296256 19 Ноя 2021 в 20:56

2 ответа

Лучший ответ

Как получить сообщение из очереди, но оставить его там до истечения срока его жизни?

Вы можете просматривать сообщения, а не получать их. Проблема в том, что сообщение будет приниматься снова и снова, пока количество доставок не превысит максимальное значение, и сообщение не станет мертвым, чего вы не хотите. Я бы пересмотрел то, чего вы здесь пытаетесь достичь, поскольку это противоречивая установка. Вы хотите, чтобы у сообщения был TTL в ожидании, что оно не будет принято, но затем вы хотите постоянно проверять его, пока TTL не истечет.

Как получить сообщение из очереди, но исключить его из очереди (удалить) только тогда, когда оно получено конкретным получателем?

Мой совет - не используйте для этого очередь. Если вы нацеливаетесь на конкретное место назначения, выразите его с помощью топологии вашей сущности. Например: опубликовать сообщение по теме и иметь разные подписки в зависимости от идентификатора подписчика. Таким образом, вы можете получать сообщения для определенных подписчиков, при этом логический подписчик может быть увеличен.

1
Sean Feldman 19 Ноя 2021 в 21:10

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://learn.microsoft.com/en-us/azure/storage/queues/storage-dotnet-how-to-use-queues?tabs=dotnet

2-вы также можете использовать PeekMessage, проверить нужное свойство (ReceiverId), и, если оно правильное, просто заполните сообщение:

// ServiceBusReceiver 
await receiver.CompleteMessageAsync(receivedMessage);
1
Thiago Custodio 19 Ноя 2021 в 21:07