gpt4 book ai didi

java - Netty客户端同步请求响应

转载 作者:太空宇宙 更新时间:2023-11-04 14:49:39 28 4
gpt4 key购买 nike

我正在尝试创建一个基于netty的http客户端。我根据 HttpSnoopClient example 编写了代码Netty 站点中给出。但问题是 HttpResponse 由 HttpSnoopClientHandler 处理,而 HttpRequests 在 HttpSnoopClient 中发送,我想同步它。就像如果我发送一个请求,我想确保一旦我知道对上一个请求的响应,我就会发送下一个请求。但由于两者都是在不同的类中处理的,因此很难做到相同。

我做的一件事是在 HttpTarget 中创建一个 setResponse() 方法,HttpSnoopClientHandler 将在收到来自服务器的响应时设置 HttpResponse。但我认为这不是一个好方法,因为我无法知道响应是针对哪个请求的。

所以基本上我想同步执行,即在 HttpSnoopClient 中发送请求(channel.writeandFlush(req)),然后等待 HttpSnoopCLientHandler 收到响应,一旦收到 HTTP 1.1 200 OK,则发送下一个请求。

谁能告诉我一个好的方法。提前致谢!

最佳答案

我有一个类似的用例,我必须阻止并发请求,直到资源完成为止。我实现了 ConcurrentHashMap<RequestKey, ArrayList<ChannelHandlerContext>>>它将容纳所有并发请求 ChannelHandlerContext (ctx) 并在第一个请求完成时引发一个事件,该事件将触发所有其他 ctx 消耗缓存的响应。在这一切中,我必须确保 AUTO_READ设置为false用于对每个 channel 上的读取进行细粒度控制。

channel 读取 ->

if(map.contains(reqKey)){
map.add(reqKey, list.add(ctx))
//do nothing with AUTO_READ = false and do not initiate any ctx.* methods
}else{
//firstRequest
map.add(reqKey, new ArrayList<CTX>(){{ add(ctx);}})
//continue with request execution
//cache response and raise event on completion
}

用户事件触发 ->

onCompletionEvent {

ctxList = map.get(reqKey).clone();
map.remove(reqKey);
for(blockedCtx : ctxList){
//respond back with cached response to each blockedCtx
}

}

@norman-maurer 你对此有何看法!!!

关于java - Netty客户端同步请求响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23950361/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com