0

私のドメインイベントを私のdbに永続化しています。私はこれらのイベントを読み込んで適切なキュー/トピックに転送し、そのメッセージをdb内のIsForwardedとしてマークするWebジョブを持っています。Azureサービスバスが仲介メッセージを受信したことをどのように知っていますか?

TopicClient.Send()とQueueClient.Send()は配信を保証します。配信に失敗した場合、Webjob転送イベントがdbを更新しないように例外が保証されますか?本質的に、私はメッセージがサービスバスによって受信されることをどのように保証できるかを知りたい。

キュー/トピックにメッセージを送る私の現在の方法は次のとおりです。

 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:Send呼び出しは(例外なく)正常に完了した場合

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

     } 

答えて

0

、それはメッセージを得たことを意味しブローカーはそれを受け入れました。配信に失敗した場合、Sendは例外をスローします。

サポートされているService Bus APIクライアントのいずれかを使用すると、Service Busへの送信操作は常に明示的に解決されます。つまり、API操作はService Busからの受け入れ結果が到着するまで待機してから送信操作を完了します。

docs

サイドノート:同じトピックに多くのメッセージを送信し、現実のコードでは、あなたの代わりに作成し、すべてのメッセージのためにそれを閉じるTopicClientインスタンスを再利用する必要があります。スレッドセーフでもあります。

関連する問題