通过Service Fabric中的Web API Controller中的决定从RunAsync()强制返回

时间:2019-02-19 21:59:25

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

当您看到抛出诸如FabricObjectClosedException之类的异常时,此线程与场景高度相关。

问题是针对特定情况的,当您在http请求时在Web api控制器中使用StateManager commit排队时看到上述异常。

要提供更多背景知识,由于以下原因之一(here),当Service Fabric对象当前处于关闭状态时,将抛出FabricObjectCloseException

  1. 正在删除Service Fabric对象。
  2. 由于故障转移,无法访问Service Fabric对象。

如果在RunAsync() while循环内引发了以上异常,则可以从RunAsync()方法中返回建议的做法,该方法将基于link调用服务的重新启动。

如果尝试在Web API控制器中使用可靠的状态管理器时抛出异常怎么办?在这种情况下,有状态服务的RunAsync()如何退出while循环?

1 个答案:

答案 0 :(得分:1)

我不是100%肯定我了解全部情况,但是我可以想到以下情况:

您有:

  1. 公开为ServiceReplicaListener的Web API控制器,用于处理传入请求
  2. 某些{em>后台/继续用RunAsync方法完成的工作

这里的第一件事是检查抛出CancellationToken时是否设置了传递给RunAsync的{​​{1}}。

据我了解,FabricObjectCloseException在关闭副本时被抛出(here,我曾经描述过集群管理器或其他原因在服务关闭时Service Fabric执行的步骤)。如果这个假设是正确的,那么应该设置FabricObjectCloseException

如果未设置通过CancellationToken的权限-那么我建议您:

  1. 创建一个包装CancellationToken的简单服务
  2. CancellationTokenSource类的构造函数中创建CancellationTokenSource的实例,并从#1初始化服务。
  3. 使用依赖项注入,将此服务注入Web API控制器中,并在发生StatefulService时取消信号。
  4. FabricObjectCloseException中,检查以下两项的取消状态:已通过RunAsync和自定义服务。

P.S。我不确定您在CancellationToken方法中从事哪种工作,但是我只想提一下,完成工作的背景部分后,从RunAsyncreturn是可以的-甚至在没有后台工作时也不要覆盖它。