首页 > 解决方案 > 轮询状态更新的长任务

问题描述

我有一个用例,我需要以下内容

  1. 调用一个 POST 端点,它启动一个进程并给出一个称为“处理”的状态。假设我们有 POST /accounts 开始创建帐户资源。

  2. 调用 GET 端点 (GET /accounts/{id}),它将提供帐户资源的状态。让我们假设只有两种状态——>“处理中”和“完成”。我需要继续轮询 GET 端点,直到资源状态更改为“已完成”

  3. 一旦 GET /accounts/{id} 返回状态已完成,我需要返回已完成的资源。

我的主要问题是如何在 rxjava 中使用长轮询来做到这一点。我在这里查看了一些链接

非常感谢任何帮助。

标签: javaspringrx-java

解决方案


您可以使用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();

推荐阅读