【问题标题】:Polling for long task for status update轮询状态更新的长任务
【发布时间】:2019-03-28 19:09:26
【问题描述】:

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

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

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

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

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

非常感谢任何帮助。

【问题讨论】:

    标签: java spring rx-java


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。会试一试,会让你知道。但我认为这是有道理的
    猜你喜欢
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    相关资源
    最近更新 更多