gpt4 book ai didi

java - com.sun.net.httpserver.HttpExchange 属性是否已损坏?

转载 作者:行者123 更新时间:2023-12-01 19:40:12 27 4
gpt4 key购买 nike

首先一些(非常基本的)示例代码来说明我的问题:

final java.util.concurrent.atomic.AtomicLong previousId = new java.util.concurrent.atomic.AtomicLong();
final com.sun.net.httpserver.HttpServer server = com.sun.net.httpserver.HttpServer.create(new java.net.InetSocketAddress(8666), 0);
server.setExecutor(java.util.concurrent.Executors.newCachedThreadPool());
server.createContext("/", exchange -> {
final long id = previousId.incrementAndGet();
System.out.println(String.format("#%s: id attribute=%s", id, exchange.getAttribute("id")));
exchange.setAttribute("id", id);
while (true) {
try {
Thread.sleep(1_000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
System.out.println(String.format("#%s: id attribute=%s", id, exchange.getAttribute("id")));
}
});
server.start();

运行此程序时(在 Java SE 1.8.0_171 上),如果我连续向 http://localhost:8666 发出两个请求,我会收到以下日志:

#1: id attribute=null
#1: id attribute=1
#1: id attribute=1
#2: id attribute=1
#1: id attribute=2
#2: id attribute=2
#1: id attribute=2
#2: id attribute=2

对于请求 #1,该属性最初为 null,正如预期的那样。但对于请求 #2,属性最初为 1,这似乎意味着初始值是从其他请求继承的。更糟糕的是,如您所见,将请求 #2 的值更改为 2 也会将请求 #1 的值更改为 2。看来这些属性是在 HttpExchange 实例之间共享的,这不是我所期望的。

我是否缺少某些内容或者 HttpExchange 属性已损坏?

最佳答案

查看the source code很明显,HttpExchange 属性由同一 HttpContext 上的所有实例共享。尽管 setAttributegetAttribute 方法是在 HttpExchange 上定义的,但我发现它具有误导性。 Javadoc我认为也没有帮助:

Filter modules may store arbitrary objects with HttpExchange instances as an out-of-band communication mechanism.

我有sent an email to the net-dev mailing listfiled a bug 。一旦有消息我就会更新这个答案。

关于java - com.sun.net.httpserver.HttpExchange 属性是否已损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59178977/

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