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