通过在 Service Fabric 中的 Web API 控制器中做出的决定从 RunAsync() 强制 return

Force return from RunAsync() via decision made in web API Controller in Service Fabric

当您看到 FabricObjectClosedException.

等抛出异常时,此线程与场景高度相关

问题是针对特定场景的,当您在使用 StateManager 入队时看到上述异常,并根据 http 请求在 Web api 控制器中提交。

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

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

如果上述异常是在 RunAsync() while 循环中抛出的,推荐的做法是 return 在 RunAsync() 方法之外,它根据link.

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

我不是 100% 确定我理解全貌,但我可以想到以下情况:

你有:

  1. Web API 控制器公开为 ServiceReplicaListener 以服务传入请求
  2. 一些背景/继续RunAsync方法中完成的工作

这里的第一件事是在抛出FabricObjectCloseException时检查是否设置了传递给RunAsyncCancellationToken

据我所知,FabricObjectCloseException 在集群管理器关闭副本时抛出(here 我曾经描述过服务关闭时 Service Fabric 执行的步骤)或其他一些原因.如果此假设成立,则应设置 CancellationToken

如果未设置通过 CancellationToken - 那么我可以建议您:

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

P.S。我不确定你在 RunAsync 方法中做了什么样的工作,但我只想提一下,当工作的背景部分完成时,可以从 RunAsyncreturn - 或者在没有后台工作时甚至不覆盖它。