Как узнать или подтвердить, что служебная шина Azure получила сообщение брокера?
Я сохраняю события моего домена в моей базе данных. У меня есть веб-задание, которое читает эти события и затем перенаправляет их в соответствующую очередь / тему, а затем помечает сообщение как IsForwarded в БД.
Мой вопрос заключается в том, гарантируют ли TopicClient.Send() и QueueClient.Send() доставку, и если она не доставляется, гарантирует ли она исключение, чтобы мои события переадресации веб-заданий не обновляли базу данных? По сути, я хочу знать, как я могу гарантировать, что сообщения принимаются служебной шиной.
Мой текущий метод отправки сообщения в очередь / тему:
private void PublishMessage(MessageQueue message, string queueName)
{
this.InitializeEventQueue(queueName, null);
var client = TopicClient.CreateFromConnectionString(_connectionString, queueName);
var brokeredMessage = this.CreateBrokeredMessage(message, message.MessageId.ToString());
client.Send(brokeredMessage);
client.Close();
}
Webjob:
var groups = this.GetNewMessages()
.GroupBy(a => new { a.DuplicationDetectionId, a.TypeName });
foreach (var group in groups)
{
//get the most recent message, which would be the last one of the group
var message = group.OrderBy(a => a.CreateDate).Last();
var queueName = this.GetQueueName(message.TypeName);
this._messagingService.PublishMessage(message, queueName, 0);
message.MarkAsForwarded();
this._dbContext.Entry(message).State = EntityState.Modified;
//mark as forwarded
foreach (var storedEvent in group.Where(a => !a.IsForwarded))
storedEvent.Delete();
this._dbContext.SaveChanges();
}
1 ответ
Если Send
Вызов завершается успешно (без исключения), это означает, что сообщение было доставлено и брокер принял его. Если доставка не удалась, Send
выбросит исключение.
При использовании любого из поддерживаемых клиентов API шины интеграции операции отправки в шину обслуживания всегда устанавливаются в явном виде, что означает, что операция API ожидает получения результата приема от шины обслуживания, а затем завершает операцию отправки.
Примечание: в реальном коде, который отправляет много сообщений на одну и ту же тему, вы должны использовать повторно TopicClient
экземпляр вместо создания и закрытия его для каждого сообщения. Это потокобезопасный тоже.