当您看到抛出诸如FabricObjectClosedException
之类的异常时,此线程与场景高度相关。
问题是针对特定情况的,当您在http请求时在Web api控制器中使用StateManager commit排队时看到上述异常。
要提供更多背景知识,由于以下原因之一(here),当Service Fabric对象当前处于关闭状态时,将抛出FabricObjectCloseException
:
如果在RunAsync()
while循环内引发了以上异常,则可以从RunAsync()
方法中返回建议的做法,该方法将基于link调用服务的重新启动。
如果尝试在Web API控制器中使用可靠的状态管理器时抛出异常怎么办?在这种情况下,有状态服务的RunAsync()
如何退出while循环?
答案 0 :(得分:1)
我不是100%肯定我了解全部情况,但是我可以想到以下情况:
您有:
ServiceReplicaListener
的Web API控制器,用于处理传入请求RunAsync
方法完成的工作这里的第一件事是检查抛出CancellationToken
时是否设置了传递给RunAsync
的{{1}}。
据我了解,FabricObjectCloseException
在关闭副本时被抛出(here,我曾经描述过集群管理器或其他原因在服务关闭时Service Fabric执行的步骤)。如果这个假设是正确的,那么应该设置FabricObjectCloseException
。
如果未设置通过CancellationToken
的权限-那么我建议您:
CancellationToken
的简单服务CancellationTokenSource
类的构造函数中创建CancellationTokenSource
的实例,并从#1初始化服务。StatefulService
时取消信号。FabricObjectCloseException
中,检查以下两项的取消状态:已通过RunAsync
和自定义服务。 P.S。我不确定您在CancellationToken
方法中从事哪种工作,但是我只想提一下,完成工作的背景部分后,从RunAsync
到return
是可以的-甚至在没有后台工作时也不要覆盖它。