Как узнать или подтвердить, что служебная шина 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 экземпляр вместо создания и закрытия его для каждого сообщения. Это потокобезопасный тоже.

Другие вопросы по тегам