0

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(); 

     } 

Antwort

0

Wenn Send erfolgreich ausgeführt wird (ohne Ausnahme), bedeutet dies, dass die Nachricht bekam geliefert und Makler akzeptiert es. Wenn die Zustellung fehlgeschlagen ist, wird Send eine Ausnahme auslösen.

Bei Verwendung eines der unterstützten Service Bus-API-Clients werden Sendevorgänge in Service Bus immer explizit abgerechnet. Dies bedeutet, dass der API-Vorgang auf ein Akzeptanzergebnis von Service Bus wartet und den Sendevorgang abschließt.

docs

Randbemerkung: in real-life-Code, der viele Nachrichten mit demselben Thema sendet, sollten Sie TopicClient Instanz wiederverwenden, anstatt zu schaffen und es für jede Nachricht zu schließen. Es ist auch threadsicher.

Verwandte Themen