Pracując z Service Bus zastanawiałem się, czy można opóźnić wysyłanie/pojawianie się wiadomości na kolejkę Service Bus. Znacznie uprościłoby to architekturę całego rozwiązania i zmniejszyło liczbę wywołań Azure Functions. Otóż można. Wystarczy tylko ustawić propertis ScheduledEnqueueTimeUtc
klasy Microsoft.Azure.ServiceBus.Message
.
Samo tworzenie przykładowej opóźnionej wiadomości wygląda więc następująco:
string message = "Delayed message"; Message queueMessage = new Message(Encoding.UTF8.GetBytes(message)); // Pojawienie się wiadomości na kolejce za 5 minut: queueMessage.ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddMinutes(5); // Pojawienie się wiadomości na kolejce za 30 sekund:<br> queueMessage.ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddSeconds(30);
Helper
Żeby uprościć pracę stworzyłem małą klasę z helperami do wysyłania wiadomości na Service Bus Queue:
UWAGA
Tutaj mała uwaga: jeżeli chcesz wysłać jedną wiadomość na daną kolejkę te metody sprawdzą się bardzo dobrze. Natomiast w momencie, gdy tych wiadomości wysyłanych na tą samą kolejkę jest więcej dużo lepszym pomysłem jest przekazywanie tej samej instancji QueueClient
do każdego wywołania metody I nie zamykanie połączenia po wysłaniu (czyli brak wywołania metody QueueClient.CloseAsync()
).