Как правильно внедрить ресурсы диспетчера состояний Service Fabric в ICommunicationListener во время инициализации?

Для ServiceFabric Stateful ReliableService:

Я хочу внедрить IReliableQueue в ICommunicationListener (прослушиватель темы служебной шины), чтобы поставить в очередь долго выполняющиеся задачи для обработки в фоновом режиме.

Я бы предпочел сделать это в перегрузке фабричного метода:

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
    var commandQueue = StateManager.GetOrAddAsync<IReliableQueue<Command>>("commandbus").Result;
    var topicListener = communicationListenerCtor(commandQueue);
    return []{new ServiceReplicaListener(context => topicListener, ...));}
}

Учитывая, что StateManager предоставляет асинхронный доступ к IReliableQueue только через метод GetOrAddAsync, а фабричный метод - это синхронизация, этот подход мягко говоря не кажется правильным.

Каков правильный подход для доступа к состоянию StateManager вне метода RunAsync?


person gumaflux    schedule 28.03.2017    source источник


Ответы (2)


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

Так что просто измените свой код на:

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
    var topicListener = communicationListenerCtor(this.StateManager);
    return []{new ServiceReplicaListener(context => topicListener, ...));}
}
person Vaclav Turecek    schedule 28.03.2017

Глядя на этот образец:

https://github.com/Azure-Samples/service-fabric-dotnet-getting-started/blob/master/Services/WordCount/WordCount.Service/Controllers/DefaultController.cs

Я понял, что мой дизайн был ошибочным, потому что я ввел экземпляр IReliableQueue, а не IReliableStateManager. Теперь я получаю экземпляр очереди из StateManager в моем методе экземпляра ICommunicationListener, а не в конструкторе, введенном для экземпляра очереди. Я, очевидно, вставляю IReliableStateManager в конструктор ICommunicationListener.

Не уверен, что это лучшая практика, но это решило мою проблему.

person gumaflux    schedule 28.03.2017
comment
Ссылка сейчас не работает - person michaelmsm89; 09.08.2017