我有以下工作流程:
Deleting
,启动后台进程并向调用者返回 ok。有一个单独的作业表来跟踪这些后台进程及其状态。Deleted
,或者如果出现错误,状态将变为 DeleteFailed
。此状态将反映在 UI 中。注意:一旦状态为“正在删除”,UI 上的删除按钮将被禁用。如果删除失败,删除按钮会再次启用,调用者可以再次调用删除API
问题: 如果后台线程执行期间出现 infra/db 故障,资源将永远处于
Deleting状态。
解决方案:
- 在节点启动时添加了作业恢复代码(从主方法),它将检查是否有作业处于运行状态,如果有则重新运行作业。此处跳过实现细节。这已经解决了
- 在这种情况下,作业完成(可能是成功/失败),但数据库记录处于挂起状态(正在删除)。怎么解决这个问题?
无法从 UI 进行另一个删除调用,因为“删除按钮”被禁用
确定你的“主人”,即控制整个操作的人。如果主设备本身没有状态,那么您需要有一个具有状态的状态主设备,最好是整个事物的第一个子部分。
如果您没有有效地获得“卡住”操作的方法,那么执行扫描的清理线程可能不是一个好主意。在这种情况下,死信队列会更简单。