Java 嵌入式码头在优雅终止期间关闭开放式连接

Java 嵌入式码头在优雅终止期间关闭开放式连接,java,curl,jersey,jetty,embedded-jetty,Java,Curl,Jersey,Jetty,Embedded Jetty,我已经编写了一个基本的嵌入式jetty服务器(用jersey定义端点),需要它优雅地终止(响应SIGINT)。我希望所有飞行中的请求完成处理并将结果返回给请求者(直到超时),同时不接受任何新的连接/请求 我看到的当前行为是,飞行中的请求正确完成,但与客户端的连接被终止(因此它们不会收到对其请求的响应) 创建我的服务器实例时,我将setStopAtShutdown设置为true,并为setStopTimeout设置一个值。我还配置了统计处理程序。从文档中可以看出,这是实现优雅终止所必需的 以下是我

我已经编写了一个基本的嵌入式jetty服务器(用jersey定义端点),需要它优雅地终止(响应SIGINT)。我希望所有飞行中的请求完成处理并将结果返回给请求者(直到超时),同时不接受任何新的连接/请求

我看到的当前行为是,飞行中的请求正确完成,但与客户端的连接被终止(因此它们不会收到对其请求的响应)

创建我的
服务器
实例时,我将
setStopAtShutdown
设置为
true
,并为
setStopTimeout
设置一个值。我还配置了
统计处理程序
。从文档中可以看出,这是实现优雅终止所必需的

以下是我的jetty服务器设置:

//有关其他Jetty配置选项,请参阅:
// https://www.eclipse.org/jetty/documentation/current/embedding-jetty.html#_like_jetty_xml
公共静态服务器createServer(
int-port、int-shutdown、int-httpServerThreads、int-httpIdleTimeoutMillis){
//创建服务器
QueuedThreadPool threadPool=新的QueuedThreadPool();
setMaxThreads(httpServerThreads);
服务器=新服务器(线程池);
HttpConfiguration config=新的HttpConfiguration();
ServerConnector http=新的ServerConnector(服务器,新的HttpConnectionFactory(配置));
http.setPort(端口);
http.setIdleTimeout(httpIdleTimeoutMillis);
addConnector(http);
//启用StatisticsHandler(正常终止需要)
StatisticsHandler stats=新的StatisticsHandler();
setHandler(server.getHandler());
setHandler(stats);
ServerConnectionStatistics.addToAllConnectors(服务器);
//配置优雅终止
server.setStopAtShutdown(true);
server.setStopTimeout(关机时间为毫秒);
//将泽西岛与码头联系起来
JettyHttpContainer集装箱=
ContainerFactory.createContainer(JettyHttpContainer.class,新AppResourceConfig());
setHandler(容器);
返回服务器;
}
这是我的球衣资源。它使用
Thread.sleep
模拟一些需要在服务器关闭前完成的长时间运行的请求

@POST
@使用(“应用程序/json”)
@生成(MediaType.TEXT\u PLAIN)
公共字符串testEndpoint(){
对于(int i=0;i<4;i++){
试一试{
记录器信息(“编号:+i”);
睡眠(5000);
}捕获(例外e){}
}
logger.info(“请求已完成!”);
返回“你好,世界!\n”;
}
我运行服务器并发出以下curl命令

curl-v——标题“内容类型:应用程序/json”\
--请帖\
--数据''\
http://localhost:4200/testEndpoint
当我将SIGINT发送到服务器进程,而此请求仍在等待响应时,我会在服务器上看到:

INFO  c.a.a.s.resources.Resource - Number: 0
INFO  c.a.a.s.resources.Resource - Number: 1
^C {{NOTE: SIGINT issued here}}
[Thread-1] INFO  o.e.jetty.server.AbstractConnector - Stopped ServerConnector@32c726ee{HTTP/1.1,[http/1.1]}{0.0.0.0:4200}
INFO  c.a.a.s.resources.AuctionResource - Number: 2
INFO  c.a.a.s.resources.AuctionResource - Number: 3
INFO  c.a.a.s.resources.AuctionResource - Request completed!
我们可以从服务器日志中看到请求已正确完成。curl命令永远不会得到“Hello,world!”的响应(这是在一个常规的非中断请求中实现的)

curl输出如下所示:

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 4200 (#0)
> POST /testEndpoint HTTP/1.1
> Host: localhost:4200
> User-Agent: curl/7.54.0
> Accept: */*
> Content-Type: application/json
> Content-Length: 0
> 
* Empty reply from server
* Connection #0 to host localhost left intact
curl: (52) Empty reply from server

我期望从服务中得到正确的回复,但是从服务器得到的却是一个空的回复。嵌入式jetty服务器在正常终止期间不关闭飞行中请求的连接还需要什么配置?

jetty的哪个版本?