1

对于 ServiceFabric 有状态的 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 仅通过 GetOrAddAsync 方法提供对 IReliableQueue 的异步访问,而工厂方法是同步的,因此这种方法说得委婉些。

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

4

2 回答 2

2

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

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

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
    var topicListener = communicationListenerCtor(this.StateManager);
    return []{new ServiceReplicaListener(context => topicListener, ...));}
}
于 2017-03-28T18:30:11.900 回答
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。

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

于 2017-03-28T18:31:16.137 回答