Secretary
一个复杂的任务管理器。
Secretary 是一个用于管理未来任务的工具。它适用于管理异步任务队列,其中并非所有任务都应同时执行,或者某些任务可能会失败。
特点
- 可靠的任务队列
- 结果验证
- 重试处理:限制、策略、条件
- 键和结果的类型约束
- 事件流,以及将流拆分为结果流和错误流的便捷方法
即将推出的功能
- 并发
简单的用例
想象一下,您想管理将多个文件上传到某个服务器,并且想将它们排队,以便它们不会同时发生并破坏任何脆弱的网络协议中最薄弱的环节。您不一定关心从这个过程中收集任何结果,但您确实想检查 HTTP 状态码是否为 200(成功),并在不成功时重试一定次数。您可以这样做:
Future<int> uploadFile(String path) async {
// ... upload logic
// maybe it returns 4xx or 5xx sometimes
return 200;
}
final secretary = Secretary<String, int>(
validator: (code) => code == 200 ? null : code, // returning null means no error, otherwise pass the code
maxAttempts: 5, // retry up to 5 times
);
final paths = ['0001.mov', '0002.mov', '0003.mov']; // and so on and so on
for (String p in paths) {
secretary.add(
p,
() => uploadFile(p),
);
}
错误怎么办?
假设您有上述用例,但您想记录上传失败的文件?好吧,您只需添加这一行:
secretary.failureStream.listen((event) => recordFailure(event.key, event.error));
请注意,还有 secretary.errorStream,但它也包括导致重试的错误,以及导致失败的错误。您也可以自行排序,通过检查 event.isFailure 来记录它们。
另请注意,所有 SecretaryEvent 对象,包括成功的对象,都包含一个在所有尝试中遇到的所有错误的列表。在大多数情况下,这些将与最终错误大致相同,但您可以通过 event.errors 访问它们。
重试条件
承接上面的例子,如果您想普遍重试,但并非针对所有错误?例如,上传文件时可能会收到错误 415 不支持的媒体类型。这是一个无论重试多少次都不会改变的错误,所以没有意义。只需添加一个 retryIf 条件:
final secretary = Secretary<String, int>(
validator: (code) => code == 200 ? null : code,
maxAttempts: 5,
retryIf: (error) => error != 415,
);
在这种情况下,导致 415 错误的任务将被声明为失败,您可以在流中看到它们的事件并按上述方式记录它们。