どのように同期として抽象非同期のHTTP要求へ

kosgeinsky:

私はサードパーティのREST APIサービスを持っている「非同期」振る舞います。リクエストのように中間応答に相関してコールバックによって補完されている中間応答で応答します。

コールバックは、「コールバックURL」を介してほとんどすぐに返されます。

私は、同じサードパーティによって他の類似のAPIにシリアルIは、バッチ、連続する要求に必要な場合は特に、それは「同期」だったかのように、コールバックに対処するための面倒なので、このリソースを呼び出すためにソートアダプターのソリューションを考案しようとしています。呼び出し側が唯一のフルのコールバック、エラーやタイムアウト例外を取得するように、基本的に私は抽象的な緑の一部にしたいです。ここでは、画像の説明を入力します。

RxJavaを使用しての私の研究のポイントが、私はこの問題は(私の理解が限られている)は、反応性のプログラミングの原則によって解決することができる方法を見つけ出すことはできません。

設計上の考慮事項:

  1. それは高価であるため、コールバック時に、後で参照するためにデータストアに相関器を永続化することは望ましいことではありません
  2. コールバックの応答時間が1秒未満であるため、コールバック待ちの戦略はOKです

どのように私は使用することができCompletableFuture、またはObservable-Observerパターンは、発信者へのコールバックと復帰を待ちますか?

starikoff:

あなたはこれを持っている場合:

public ImmediateResponse asynchCall(Callback callback) throws ImmediateException {...}

どこでCallback次のようになります。

interface Callback {
    void onSuccess(EventualResponse eventualResponse);
    void onFailure(Exception e);
}

そして、何が欲しいのはこのようなものです:

public static EventualResponse synchCall(long timeout, TimeUnit timeUnit)
        throws InterruptedException, TimeoutException, EventualException
{
    CompletableFuture<EventualResponse> responseFuture = new CompletableFuture<>();
    Callback callback = new Callback() {
        public void onSuccess(EventualResponse response) { 
            responseFuture.complete(response); 
        }
        public void onFailure(Exception e) { 
            responseFuture.completeExceptionally(e); 
        }
    };
    try {
        /*ImmediateResponse immediateResponse = */asynchCall(callback); 
        // use immediateResponse if you need it
        return responseFuture.get(timeout, timeUnit);
    } catch (ImmediateException e) {
        throw new EventualException(e);
    } catch (ExecutionException ee) {
        throw new EventualException(ee.getCause());
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=219074&siteId=1