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 错误的任务将被声明为失败,您可以在流中看到它们的事件并按上述方式记录它们。

GitHub

查看 Github