Служба приложений Azure не может получить данные из центра IoT Azure - PullRequest
0 голосов
/ 26 июня 2018

Я хочу использовать службу приложений Azure для получения данных из центра IoT Azure.

Я пытаюсь зарегистрировать событие обратного вызова в IoT Hub в функции Application_Start ().

Когда я могу запустить свою программу с Visual Studio 2017 на своем ПК, обычно запускается событие с помощью Azure IoT Hub и получает данные.

К сожалению, при развертывании в облаке Azure, который является службой «Служба приложений Azure», он может получить событие триггера из концентратора IoT Azure только при запуске службы приложений в течение нескольких секунд.

Данные не возвращаются из концентратора IoT Azure, и событие больше не инициируется.

Я не знаю причину. Любой совет будет оценен.

Вот код запуска события, который будет запущен в начале службы приложений. Точка входа - функция Main ().



    using Microsoft.ServiceBus.Messaging;
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.Threading.Tasks;
    using System.Web;
    using TelemetryEPHostConsoleApp;

    namespace MCM100_Dashboard.App_Start.TelemetryProcessor
    {
        public class TelemetryMain
        {
            private const string STORAGEACCOUNT_PROTOCOL = "https";// We use HTTPS to access the storage account

            public async static void Main()
            {
                var mainTask = new Task(GetAzureData);
                mainTask.Start();
                await mainTask;
            }
            public static string GetAzureData()
            {
               // IoT Hub
                string iotHubConnectionString = ConfigurationManager.AppSettings["IoTHub.ConnectionString"];
                string eventHubPath = "messages/events";// It's hard-coded for IoT Hub
                string consumerGroupName = "mcmpush";// It's hard-coded for this workshop

                // Storage Account
                string storageAccountName = ConfigurationManager.AppSettings["StorageAccount.Name"];
                string storageAccountKey = ConfigurationManager.AppSettings["StorageAccount.Key"];
                string storageAccountConnectionString = CombineConnectionString(storageAccountName, storageAccountKey);
                string eventProcessorHostName = "eventprocessorhost";
                string leaseName = eventProcessorHostName;

                EventProcessorHost eventProcessorHost = new EventProcessorHost(
                    eventProcessorHostName,
                    eventHubPath,
                    consumerGroupName,
                    iotHubConnectionString,
                    storageAccountConnectionString,
                    leaseName);


                var options = new EventProcessorOptions
                {
                    InitialOffsetProvider = (partitionId) => DateTime.UtcNow
                };
                options.ExceptionReceived += (sender, e) => { Console.WriteLine(e.Exception); };
                re: try
                {
                    eventProcessorHost.RegisterEventProcessorAsync(options).Wait();
                }
                catch (Exception e)
                {
                    System.Threading.Thread.Sleep(1000);
                    goto re;
                }


                eventProcessorHost.UnregisterEventProcessorAsync().Wait();

                return "";

            }

            private static string CombineConnectionString(string storageAccountName, string storageAccountKey)
            {
                return "DefaultEndpointsProtocol=" + STORAGEACCOUNT_PROTOCOL + ";" +
                    "AccountName=" + storageAccountName + ";" +
                    "AccountKey=" + storageAccountKey;
            }
        }
    }



    using Microsoft.ServiceBus.Messaging;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Net;
    using System.Configuration;
    using System.IO;
    using System.Web;

    namespace TelemetryEPHostConsoleApp
    {
        class TelemetryEventProcessor :IEventProcessor
        {
            static WebServerConnector _webSC = new WebServerConnector();

            async Task IEventProcessor.CloseAsync(PartitionContext context, CloseReason reason)
            {
                if (reason == CloseReason.Shutdown)
                {
                    await context.CheckpointAsync();
                }
            }

            Task IEventProcessor.OpenAsync(PartitionContext context)
            {
                return Task.FromResult(null);
            }

            async Task IEventProcessor.ProcessEventsAsync(PartitionContext context, IEnumerable messages)
            {
                // hope to trigger event
                foreach (EventData eventData in messages)
                {
                    string data = Encoding.UTF8.GetString(eventData.GetBytes());

                }

                //Call checkpoint every 5 minutes, so that worker can resume processing from 5 minutes back if it restarts.
                if (this.checkpointStopWatch.Elapsed > TimeSpan.FromMinutes(5))
                {
                    await context.CheckpointAsync();
                    this.checkpointStopWatch.Restart();
                }
            }

            private void ProcessMessage(string data)
            {
               return "";
            }

        }
    }

1 Ответ

0 голосов
/ 26 июня 2018

Сразу после RegisterEventProcessorAsync вы выполняете UnregisterEventProcessorAsync. Это почему? Вы не тратите много времени на обработку событий. Возможно, было бы лучше использовать непрерывно работающую веб-работу для чтения данных из центра IoT.

Вам следует звонить UnregisterEventProcessorAsync только тогда, когда вы хотите прекратить прослушивание входящих событий. Среда выполнения будет вызывать Task IEventProcessor.ProcessEventsAsync(PartitionContext context, IEnumerable messages) любое количество раз после регистрации обработчика событий и до отмены регистрации.

Кроме того, что случилось с return "";, который я вижу пару раз?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...