我正在尝试创建一个基于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/