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

标签 java http synchronization httprequest netty

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

相关文章:

java - hashmap 并从中检索数据

Java - 与命令行\IDE 执行相关的 "user.dir"属性

http - 使用哪个 Http 重定向状态码?

java - 内容类型 "text/xml; charset=utf-8"是错误的吗?

windows - 在本地和虚拟机之间同步

c - 多线程 - Unix 上的同步

java - 为什么我的 Dijkstra 代码会失败?

java - Eclipse 3.4和Jboss部署问题:

http - 在一个脚本中发送多个 HTTP 状态码

java - Java 中的同步构造是否在内部(以某种方式)使用硬件原语 CAS 操作?