【发布时间】:2017-05-03 21:25:09
【问题描述】:
让我们考虑一个工人角色:
- 托管 WCF 服务器
- 监听一些 Azure 存储队列和服务总线队列
处理方法执行一些 Azure 存储 I/O、HttpClient 调用外部 API 和实体框架调用。现在我希望我的工作角色能够正常关闭,以便所有待处理的操作都以托管方式完成或取消:
- 一旦触发
RoleEntryPoint.OnStop(),就停止接受任何传入的请求。 Azure 是否适合我?如果不是,我该如何执行? - 允许
N秒以完成任何挂起的操作 -
N秒后取消剩下的所有操作。取消不得超过M秒,以便N + M < 5 minutes。我相信 5 分钟是 Azure 运行时在触发OnStop()之后和终止进程之前将等待的保证时间。
我正在把它想象成这样:
public override void Run() {
// create a cancellation token source
try {
// pass the token to all processing/listening routines
}
catch (Exception e) { }
}
public override void OnStop() {
try {
// trigger the cancellation token source
}
catch (Exception e) { }
}
上面的简单示例假设我所有的处理例程都是从上到下异步的(对于 EF/HttpClient 调用)。如果这是要走的路,我需要一个工作示例来处理先决条件(WCF 主机、队列侦听器)。
打开的问题:
- 如何确保在触发
OnStop()后不再向我的辅助角色发送传入的 TCP 请求?这对于将关闭代码设置为 5 分钟限制非常重要。 - 考虑到配置文件中的 WCF 通道超时、EF 超时等所有内容,如何找出
N和M的具体数字? - 甚至可以使用同步代码吗?
【问题讨论】:
-
我会尝试创建一个单调(静态或取决于 di 容器),其标志在挂起时为真。对于 azure 存储队列客户端来说,这应该足够了。至于其他 wcf 和服务总线,我不确定:( 但 afaik 你应该能够关闭监听器
-
为了解决超时问题而不是布尔标志,我将使用日期时间来检查是否应该停止使用消息
标签: .net azure asynchronous timeout application-shutdown