通过在 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
:
- 正在删除 Service Fabric 对象。
- 由于故障转移,无法访问 Service Fabric 对象。
如果上述异常是在 RunAsync()
while 循环中抛出的,推荐的做法是 return 在 RunAsync()
方法之外,它根据link.
如果在 web API 控制器中尝试使用可靠的状态管理器时抛出异常怎么办?这种情况下有状态服务的RunAsync()
如何跳出while循环?
我不是 100% 确定我理解全貌,但我可以想到以下情况:
你有:
- Web API 控制器公开为
ServiceReplicaListener
以服务传入请求
- 一些背景/继续在
RunAsync
方法中完成的工作
这里的第一件事是在抛出FabricObjectCloseException
时检查是否设置了传递给RunAsync
的CancellationToken
。
据我所知,FabricObjectCloseException
在集群管理器关闭副本时抛出(here 我曾经描述过服务关闭时 Service Fabric 执行的步骤)或其他一些原因.如果此假设成立,则应设置 CancellationToken
。
如果未设置通过 CancellationToken
- 那么我可以建议您:
- 创建一个包装
CancellationTokenSource
的简单服务
- 在
StatefulService
class 的构造函数中创建 CancellationTokenSource
的实例并从 #1 初始化服务。
- 使用依赖注入,在 Web API 控制器中注入此服务,并在发生
FabricObjectCloseException
时取消信号。
- 在
RunAsync
中检查两者的取消状态:通过CancellationToken
和自定义服务。
P.S。我不确定你在 RunAsync
方法中做了什么样的工作,但我只想提一下,当工作的背景部分完成时,可以从 RunAsync
到 return
- 或者在没有后台工作时甚至不覆盖它。
当您看到 FabricObjectClosedException
.
问题是针对特定场景的,当您在使用 StateManager 入队时看到上述异常,并根据 http 请求在 Web api 控制器中提交。
为了提供更多背景故事,当 Service Fabric 对象由于以下原因之一 (here) 当前处于关闭状态时抛出 FabricObjectCloseException
:
- 正在删除 Service Fabric 对象。
- 由于故障转移,无法访问 Service Fabric 对象。
如果上述异常是在 RunAsync()
while 循环中抛出的,推荐的做法是 return 在 RunAsync()
方法之外,它根据link.
如果在 web API 控制器中尝试使用可靠的状态管理器时抛出异常怎么办?这种情况下有状态服务的RunAsync()
如何跳出while循环?
我不是 100% 确定我理解全貌,但我可以想到以下情况:
你有:
- Web API 控制器公开为
ServiceReplicaListener
以服务传入请求 - 一些背景/继续在
RunAsync
方法中完成的工作
这里的第一件事是在抛出FabricObjectCloseException
时检查是否设置了传递给RunAsync
的CancellationToken
。
据我所知,FabricObjectCloseException
在集群管理器关闭副本时抛出(here 我曾经描述过服务关闭时 Service Fabric 执行的步骤)或其他一些原因.如果此假设成立,则应设置 CancellationToken
。
如果未设置通过 CancellationToken
- 那么我可以建议您:
- 创建一个包装
CancellationTokenSource
的简单服务
- 在
StatefulService
class 的构造函数中创建CancellationTokenSource
的实例并从 #1 初始化服务。 - 使用依赖注入,在 Web API 控制器中注入此服务,并在发生
FabricObjectCloseException
时取消信号。 - 在
RunAsync
中检查两者的取消状态:通过CancellationToken
和自定义服务。
P.S。我不确定你在 RunAsync
方法中做了什么样的工作,但我只想提一下,当工作的背景部分完成时,可以从 RunAsync
到 return
- 或者在没有后台工作时甚至不覆盖它。