(К вашему сведению - я новый ASB)
Несколько вопросов по служебной шине Azure:
Как получить сообщение из очереди, но оставить его там , пока не истечет его TTL? Я бы подумал, что просто не вызвать CompleteMessageAsync, это сделает именно это, но, похоже, он удаляется, несмотря ни на что.
Как получить сообщение из очереди, но исключить его из очереди (удалить) только тогда, когда оно получено конкретным получателем?
Message.ApplicationProperties ["ReceiverId"]. ToString () == "123" // теперь вы можете удалить его
Благодарность
2 ответа
Как получить сообщение из очереди, но оставить его там до истечения срока его жизни?
Вы можете просматривать сообщения, а не получать их. Проблема в том, что сообщение будет приниматься снова и снова, пока количество доставок не превысит максимальное значение, и сообщение не станет мертвым, чего вы не хотите. Я бы пересмотрел то, чего вы здесь пытаетесь достичь, поскольку это противоречивая установка. Вы хотите, чтобы у сообщения был TTL в ожидании, что оно не будет принято, но затем вы хотите постоянно проверять его, пока TTL не истечет.
Как получить сообщение из очереди, но исключить его из очереди (удалить) только тогда, когда оно получено конкретным получателем?
Мой совет - не используйте для этого очередь. Если вы нацеливаетесь на конкретное место назначения, выразите его с помощью топологии вашей сущности. Например: опубликовать сообщение по теме и иметь разные подписки в зависимости от идентификатора подписчика. Таким образом, вы можете получать сообщения для определенных подписчиков, при этом логический подписчик может быть увеличен.
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);
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.