【问题标题】:How to get result of an Activity without waiting for ? In a event driven fashion如何在不等待的情况下获得 Activity 的结果?以事件驱动的方式
【发布时间】:2021-05-15 06:28:34
【问题描述】:

团队,我对并行调用活动有疑问。

我知道可以使用Async.function 并行调用活动。

对于我的用例,我想在收到所有活动的结果后并行调用 n 个活动,我想进入下一个状态,它可以是另一个活动或决策任务。

但是这里它给了我一个类似于 Java 中的 Future 的 Promise 对象。如果我们编写 promise.get() 来获取结果,但它阻塞了线程。

我需要类似于事件驱动的时尚而不阻塞线程。

希望你能理解我的问题!!

【问题讨论】:

    标签: cadence-workflow cadence uber-cadence


    【解决方案1】:

    您不必使用.get()

    Promise中,可以注册一个回调函数,当结果可用或返回错误时调用。

    您可以根据需要使用以下其中一种:

    • 然后申请
    • 句柄
    • 然后编写
    • 异常

    这种风格类似于Java的CompletableFuture

    
      /**
       * Returns Promise that contains a result of a function. The function is called with the value of
       * this Promise when it is ready. #completeExceptionally is propagated directly to the returned
       * Promise skipping the function.
       *
       * <p>Note that no blocking calls are allowed inside of the function.
       */
      <U> Promise<U> thenApply(Functions.Func1<? super V, ? extends U> fn);
    
      /**
       * Returns Promise that contains a result of a function. The function is called with the value of
       * this Promise or with an exception when it is completed. If the function throws a {@link
       * RuntimeException} it fails the resulting promise.
       *
       * <p>Note that no blocking calls are allowed inside of the function.
       */
      <U> Promise<U> handle(Functions.Func2<? super V, RuntimeException, ? extends U> fn);
    
      /**
       * Returns a new Promise that, when this promise completes normally, is executed with this promise
       * as the argument to the supplied function.
       *
       * @param fn the function returning a new Promise
       * @param <U> the type of the returned CompletionStage's result
       * @return the Promise that completes when fn returned Promise completes.
       */
      <U> Promise<U> thenCompose(Functions.Func1<? super V, ? extends Promise<U>> fn);
    
      /**
       * Returns a new Promise that, when this promise completes exceptionally, is executed with this
       * promise's exception as the argument to the supplied function. Otherwise, if this promise
       * completes normally, then the returned promise also completes normally with the same value.
       *
       * @param fn the function to use to compute the value of the returned CompletionPromise if this
       *     CompletionPromise completed exceptionally
       * @return the new Promise
       */
      Promise<V> exceptionally(Functions.Func1<Throwable, ? extends V> fn);
    

    【讨论】:

      【解决方案2】:

      添加到伟大的龙的答案。

      您可以使用 Promise.anyOf 以阻塞方式等待集合中的单个 Promise 完成。

      【讨论】:

        猜你喜欢
        • 2016-07-23
        • 2017-04-27
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        • 2011-06-17
        • 1970-01-01
        • 2017-06-08
        • 2012-10-11
        相关资源
        最近更新 更多