2016-10-27 6 views
0

Microsoft Azureイベントハブで小さなプロジェクトを行っています。 AzureサブスクリプションのアクティビティログをMVCアプリケーションに表示する必要があります。MVCアプリケーションでazureイベントハブ受信機を正しく処理する方法は?

EventHubReceiverからデータを受信して​​いるときにイベントログをサービスバスにストリーミングできましたが、問題が発生しました。データがないと受信機がちょうど凍結するようです。私はこれがeventhubsが使用するパブのサブアーキテクチャのためだと理解していますが、MVCアプリケーションを使用しているので、私はフローを制御したいと思います。

今のところCancellationTokenを使用して、EventReceiverにすべてのメッセージを受信させるために6秒間明示的に待機しています。これを行うより良い方法はありますか?

public class HomeController : Controller 
    { 
     // GET: Home 
     public ActionResult Index() 
     { 
      var cts = new CancellationTokenSource(); 
      var list = new List<Record>(); 
      for (int i = 0; i < 4; i++) 
      { 
       Task.Factory.StartNew((state) => 
       { 
        var factory = MessagingFactory.CreateFromConnectionString("Endpoint=sb://xcvxcv.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xcvxcvxvxvxcvxcccccccccccccccccccccccccc;TransportType=Amqp"); 
        var client = factory.CreateEventHubClient("insights-operational-logs"); 

        var group = client.GetDefaultConsumerGroup(); 
        var receiver = group.CreateReceiver(state.ToString(), DateTime.Now.AddDays(-1)); 


        while (true) 
        { 
         if (cts.IsCancellationRequested) 
         { 
          receiver.Close(); 
          break; 
         } 
         var messages = receiver.Receive(10); 
         foreach (var message in messages) 
         { 
          var logMessage = Newtonsoft.Json.JsonConvert.DeserializeObject<LogEventMessage>(Encoding.Default.GetString(message.GetBytes())); 
          list.AddRange(logMessage.records); 
         } 
        } 
       }, i); 
      } 
      Thread.Sleep(5000); 
      cts.Cancel(); 
      return View(list.OrderBy(o => o.time)); 
     } 
    } 

答えて

0

EventProcessorHostインターフェイスを実装し、ProcessEventsAsyncでフローを制御することを検討します。

https://azure.microsoft.com/en-us/documentation/articles/event-hubs-csharp-ephcs-getstarted/

+0

EventProcessorHostはStorageAccountを使用しているようです。ストレージアカウントなしでこれを行うことは可能ですか? – Umamaheswaran

+0

ストレージアカウントは、主にチェックポイント情報を格納するために使用されるため、ProcessEventsAsyncでは作業を行い、次にチェックポイントを呼び出します。アプリケーションに障害が発生した場合は、最後にチェックポイントを設定してから取り上げることができます。別の参照:https://blogs.msdn.microsoft.com/servicebus/2015/01/16/event-processor-host-best-practices-part-1/ –

関連する問題