java - 轮询状态更新的长任务
问题描述
我有一个用例,我需要以下内容
调用一个 POST 端点,它启动一个进程并给出一个称为“处理”的状态。假设我们有 POST /accounts 开始创建帐户资源。
调用 GET 端点 (GET /accounts/{id}),它将提供帐户资源的状态。让我们假设只有两种状态——>“处理中”和“完成”。我需要继续轮询 GET 端点,直到资源状态更改为“已完成”
一旦 GET /accounts/{id} 返回状态已完成,我需要返回已完成的资源。
我的主要问题是如何在 rxjava 中使用长轮询来做到这一点。我在这里查看了一些链接
- https://github.com/ReactiveX/RxJava/issues/3482
- https://github.com/ReactiveX/RxJava/issues/448 在这些示例中,我无法理解..一旦匹配特定谓词,如何取消订阅..即。来自 GET /accounts/{id} 的状态已完成,获取并结束订阅。
非常感谢任何帮助。
解决方案
您可以使用retryWhen()
如下所示的内容。
考虑到我们有
private Single<Account> createAccount() // API call to create account
private Single<Account> getAccount(int id) // API call to get account info
在获取账户信息时,如果状态为“处理中”,我们会抛出错误,进而触发 retryWhen()。下面的代码将每 5 秒重试一次,直到状态变为“已完成”。只有 getAccount() 流会再次重试。
createAccount()
.flatMap(
createdAcc -> getAccount(accountId)
.flatMap(
status -> status == "procesing" ?
Single.error(new Throwable()) :
Single.just(status)
)
.doOnError(throwable -> Log.e("", "retrying"))
.retryWhen(errors -> errors.flatMapSingle(error -> Single.timer(5, TimeUnit.SECONDS)))
)
.subscribe();
推荐阅读
- azure - 具有自动备份功能的 Azure 分析数据库
- json - 如何在 Visual Studio Code 中控制 JSON 的格式样式?
- aem - AEM Querybuilder 获取(如果引用)
- if-statement - Else 语句没有被执行 - Unix
- angular - Angular 8在完成多个后续请求时订阅,如何?
- java - 为什么在循环中使用“str.charAt(i) = str.charAt(i+1)”时会出错
- c# - 如何按月对数据表进行分组并计算该月以下的行数
- json - 读取外部 JSON 文件
- android - 仅在没有缺口的手机上录制和工作时,媒体记录器变黑
- printthis - printThis - 不要求选择打印机