2012-04-27 15 views
2

私のアプリケーションはHTTPリクエストを受信し、パイプラインの途中で、情報をサポートするために別のサーバにコールが発信されます。最初のHTTP要求は、その応答が戻ってくるまでパイプラインを通して継続できません。私はawaitUninterruptability()をI/Oスレッドから使​​うことができないので、Nettyのイベントループをブロックしないようにこれらの呼び出しを行う最良の方法は何ですか?しかし、コールアウトが返ってパイプラインに伝えるまでクライアントのパイプラインを保留にします続ける?Nettyの同期HTTPコール

+0

しばらくそれを振って、私は正しい軌道にいると思う。私が今行っているのは、同じパイプラインハンドラの別のインスタンスを現在のスタックの直後にスタックに追加して、レスポンスハンドラを渡すことです。その後、上流に送ってください。次に、その応答ハンドラが完了したかどうか(ハンドラ内のカスタムメソッド)を確認し、そうでない場合は、ハンドラの別のインスタンスをパイプラインに追加するなどします。基本的に、応答が返ってきたときに「中断する」ハンドラのループを作成します。私が今いる唯一の問題は、応答が返される前にハンドラのスタックをオーバーフローさせることです。 –

答えて

3

..

は、私はあなたがより良いことのようなものを使用すべきだと思いますそれは別のSimpleChannelUpstreamHandlerにあります。しかし、私はあなたが考えを得ると思う..

+0

その例の 'ctx'は、アウトバウンドHTTPリクエストのコンテキストです。したがって、イベントを上流に送信することは、イベントを上流へ送信するだけです。私は、 'operationComplete'呼び出しが行われたときに上流のインバウンドHTTPリクエストからイベントを送信する必要があります。私は元のイベントを上流に送信しようとしました(インバウンドコンテキストを 'final'コンテキストを介して無名関数に渡しました)が、インバウンドから' sendUpstream'を明示的にコールしなかったときに、元のパイプラインは** downstream **ハンドラに続きましたパイプライン。 –

+0

オクラホマは正しかった、私はちょうどそれをはっきりと見なかった。また、後で実行される個別のパイプラインハンドラであったはずの、別のステップを並列で実行していたコードにバグがありました。 jistは、クライアントが作業を終了すると、クライアントイベントパイプラインが親コンテキストsendUpstreamを起動することです。クライアント実行呼び出しの後にパラレル実行を引き起こす可能性のあるものがないようにしてください(これは不要です)。 –

0

ExecutionHandlerが必要です。あなたは、あなたが処理する必要があります応答を待つ必要がある場合は

public class HttpHandler extends SimpleChannelUpstreamHandler{ 

    @Override 
    public void messageReceived(final ChannelHandlerContext ctx, final MessageEvent e) throws Exception { 
     otherChannel.write(yourRequet).addListener(new ChannelFutureListener() { 

      public void operationComplete(ChannelFuture future) throws Exception { 

       // once the write is done we can continue in the pipeline 
       ctx.sendUpstream(e); 
      } 
     }); 

     // the event stops here to get processed 

    } 

} 

:ライアンは、これは良いアイデアのような音はありません

+0

興味深い... AMでこれを試して、必要なものがあるかどうかを確認します。ありがとう! –

+0

私はドキュメントの '新しいOrderedMemoryAwareThreadPoolExecutor(16,1048576,1048576)'を見ています。これらのパラメータ値がかなり共通しているのか、それとも調整すべきなのか、もしそうなら、調整する基準は何か不思議です。 –

+0

これらの数字は、もちろん完全に任意です。あなたの数はあなたの特定のランタイムに完全に依存します。具体的にどのくらいのヒープを自由に使用できるか - オブジェクトのメモリ使用量の計算は難しい場合があります。最適なアプローチは、負荷の変動時にヒープを測定し、特定のエグゼキュータによって消費を見積もり、「控えめな」制限を設定することです。 –

関連する問題