在初始化期间将Service Fabric State Manager资源注入ICommunicationListener的正确方法是什么?

时间:2017-03-28 18:11:00

标签: azure-service-fabric service-fabric-stateful

对于ServiceFabric有状态可靠服务:

我想将一个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仅通过GetOrAddAsync方法提供对IReliableQueue的异步访问,并且工厂方法是同步的,这种方法对于温和地说是不正确的。

在RunAsync方法之外访问StateManager状态的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

你非常接近。您需要整个IReliableStateManager,而不仅仅是队列实例,因为您需要能够创建使用该队列的事务,并且该事务位于IReliableStateManager上。

所以只需将您的代码更改为:

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

答案 1 :(得分:0)

看看这个样本:

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

我意识到我的设计存在缺陷,因为我注入了IReliableQueue实例而不是IReliableStateManager。我现在从ICOMmunicationListener 实例方法中的StateManager中检索队列实例,而不是队列实例的构造函数注入。我明显地在ICommunicationListener构造函数中注入了IReliableStateManager。

不确定这是否是最佳做法模式,但这解决了我的问题。