NettyベースのHTTPクライアントでHTTPリクエストを再試行する方法はありますか?Netty HTTPクライアントでリクエストを再試行する
は、HTTP応答コード503を受信した場合、1秒後にHTTP要求を再試行しようとする次のハンドラを、検討:
私はこの例では、チャネルへの書き込みpublic class RetryChannelHandler extends ChannelDuplexHandler {
List<HttpObject> requestParts;
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
if (msg instanceof HttpRequest) {
requestParts = new ArrayList<>();
requestParts.add((HttpRequest)msg);
} else if (msg instanceof HttpObject) {
requestParts.add((HttpObject)msg);
}
super.write(ctx, msg, promise);
}
@Override
public void channelRead(final ChannelHandlerContext ctx, Object msg) throws Exception {
if (msg instanceof HttpResponse) {
HttpResponse res = (HttpResponse)msg;
if (res.status().code() == 503) {
ctx.executor().schedule(new Runnable() {
@Override
public void run() {
for (HttpObject obj : requestParts) {
ctx.channel().write(obj);
}
}
}, 1000, TimeUnit.MILLISECONDS);
} else {
super.channelRead(ctx, msg);
}
} else {
super.channelRead(ctx, msg);
}
}
}
、パイプライン内の他のハンドラHttpObjectsを参照してください。ただし、HttpRequestは実際には再度実行されません。ただ1つのHttpResponseしか受け取られません。
私はこのケースでは単にChannelを悪用していると思うし、再試行を実行するために新しいChannel(サーバーへの新しい接続を表す)を作成する必要があります。私には分かりませんが、ハンドラのコンテキストから新しいチャンネルを作成する方法と、この種のロジックを実行するNettyの適切な層に本当にいるかどうかです。
私が説明している種類の行動を達成する方法についてのガイダンスは高く評価されます。
ありがとうございます!これは、実装のマイナーな調整の後、私の問題を解決しました。 –