Ich behalte meine Domain-Ereignisse zu meiner Datenbank. Ich habe einen Webjob, der diese Ereignisse liest und sie dann an die richtige Warteschlange/das richtige Thema weiterleitet und dann die Nachricht als IsForwarded in der Datenbank markiert.Woher weiß oder bestätige ich, dass der Azure-Servicebus die vermittelte Nachricht erhalten hat?
Meine Frage ist garantiert TopicClient.Send() und QueueClient.Send() Lieferung, und wenn es nicht liefert, garantiert es eine Ausnahme, so dass meine Web-Job-Weiterleitungsereignisse nicht die Datenbank aktualisieren? Im Wesentlichen möchte ich wissen, wie ich garantieren kann, dass Nachrichten vom Servicebus empfangen werden.
Mein aktuelles Verfahren zur Herstellung eine Nachricht an eine Warteschlange/Thema zu senden ist:
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();
}