Cosmos DB - остановка экземпляра IChangeFeedProcessor

Я использую библиотеку обработчика каналов изменений для использования канала изменений Cosmos DB. Код создания IChangeFeedProcessor выглядит так:

var builder = new ChangeFeedProcessorBuilder();
processor = await builder
  .WithHostName(hostName)
  .WithFeedCollection(feedCollectionInfo)
  .WithLeaseCollection(leaseCollectionInfo)
  .WithObserverFactory(observerFactory)
  .BuildAsync();
await processor.StartAsync();

В методе ProcessChangesAsync () реализации IChangeFeedObserver я вызываю внешний API для каждого документа в пакете.

Я хотел бы остановить процессор, когда внешний API не работает, чтобы я не читал документы из канала изменений, когда я не могу их обработать.

Как остановить процессор (используя метод StopAsync ()), когда реализация IChangeFeedObserver.ProcessChangesAsync () выдает исключение?


person Amlan    schedule 30.11.2018    source источник
comment
Вы пытались сделать процессор статическим или частью синглтона и просто вызывать его при исключении из метода ProcessChangesAsync?   -  person Nick Chapsas    schedule 30.11.2018


Ответы (1)


Не уверен в реальной проблеме, но если проблема в том, как получить доступ к процессору внутри наблюдателя, как насчет этого. Вы можете украсить наблюдателя, передать экземпляр CFP декоратору, а затем перехватить / повторно выбросить все исключения, но в случае остановки CFP.

person Michael Koltachev    schedule 30.11.2018
comment
Спасибо, Майкл, за ответ. Я не уверен, понял ли я часть: передача CFP наблюдателю. Если я смогу это сделать, моя проблема будет решена. Есть ли какой-нибудь пример, на который я могу сослаться, чтобы понять, как это можно сделать? - person Amlan; 30.11.2018
comment
Как насчет этого: processor = await builder .WithHostName(hostName) .WithFeedCollection(feedCollectionInfo) .WithLeaseCollection(leaseCollectionInfo) .WithObserverFactory(observerFactory) .BuildAsync(); observerFactory.ChangeFeedProcessor = processor; // The factory will create observers passing its ChangeFeedProcessor instance to each one. await processor.BuildAsync(); - person Michael Koltachev; 30.11.2018
comment
Если вы не хотите, чтобы исходный наблюдатель знал о CFP, вы можете украсить его другим наблюдателем, который будет знать о CFP, исходный наблюдатель изменит один процесс, декоратор остановит только CFP и ничего не сделает с изменениями. - person Michael Koltachev; 30.11.2018