LeaseLostException в единственном экземпляре EventProcessorHost для концентратора IOT

Я создал простой узел обработки событий, который считывает события из концентратора Azure IOT, настроенного с параметрами по умолчанию для управления арендой.
Но через равные промежутки времени я получаю следующее исключение, хотя я запускаю один экземпляр EventProcessorHost:
ReceiverDisconnectedException: создается новый приемник с более высокой эпохой, следовательно, текущий приемник с эпохой отключается. Причина: LeaseLost
Клиент повторно приобретает аренду и обрабатывает сообщения дальше.

Вот инициализация EventProcessorHost

EventProcessorHost eventProcessorHost = new EventProcessorHost(hostName, eventHubName, EventHubConsumerGroup.DefaultGroupName,
            eventHubConnectionString, storageAccountConnectionString);
var options = new EventProcessorOptions();
options.ExceptionReceived += (sender, e) =>
{
    Console.WriteLine(e.Exception);
};

eventProcessorHost.PartitionManagerOptions = PartitionManagerOptions.DefaultOptions;
eventProcessorHost.RegisterEventProcessorAsync<SimpleEventProcessor>(options).Wait();

Это нормальное поведение, или мне нужно что-то сделать, чтобы избежать этого для одного экземпляра?

Ниже мой EventProcessor:

public class SimpleEventProcessor : IEventProcessor
{
    Stopwatch checkpointStopWatch;

    public async Task CloseAsync(PartitionContext context, CloseReason reason)
    {
        Console.WriteLine("Processor Shutting Down. Partition '{0}', Reason: '{1}'.", context.Lease.PartitionId, reason);
        await context.CheckpointAsync();
    }

    public Task OpenAsync(PartitionContext context)
    {
        Console.WriteLine("SimpleEventProcessor initialized.  Partition: '{0}', Offset: '{1}'", context.Lease.PartitionId, context.Lease.Offset);
        this.checkpointStopWatch = new Stopwatch();
        this.checkpointStopWatch.Start();
        this.rawDataService = new RawDataService();
        return Task.FromResult<object>(null);
    }

    public async Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> messages)
    {
        foreach (EventData eventData in messages)
        {
            string data = Encoding.UTF8.GetString(eventData.GetBytes());
            Console.WriteLine(string.Format("Message received.  Partition: '{0}', Data: '{1}'", context.Lease.PartitionId, data));
        }
    }
}

0 ответов

Другие вопросы по тегам