【发布时间】:2017-12-22 22:59:50
【问题描述】:
当我向嵌入式 Jetty 服务器添加两个连接器时,我既不能使用 HTTP 也不能使用 HTTPS - 浏览器/curl 只是卡住了。我用来创建嵌入式 Jetty 的代码大致如下(基于此示例 - http://self-learning-java-tutorial.blogspot.de/2015/10/jetty-configuring-many-connectors.html):
HttpConfiguration httpConfiguration = new HttpConfiguration();
httpConfiguration.setRequestHeaderSize(requestHeaderSize);
ServerConnector httpConnector= new ServerConnector(server, 1, -1, new
HttpConnectionFactory(httpConfiguration));
httpConnector.setPort(getPort());
httpConnector.setReuseAddress(true);
httpConnector.setIdleTimeout(maxTimeout);
server.addConnector(httpConnector);
HttpConfiguration httpsConfiguration = new HttpConfiguration();
httpsConfiguration.setSecureScheme("https");
httpsConfiguration.setSecurePort(securePort);
httpsConfiguration.addCustomizer(new SecureRequestCustomizer());
ServerConnector sslConnector = new ServerConnector(server,
new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
new HttpConnectionFactory(httpsConfiguration));
sslConnector.setPort(securePort);
sslConnector.setIdleTimeout(maxTimeout);
sslConnector.setReuseAddress(true);
server.addConnector(sslConnector);
ServletContextHandler servContext = new
ServletContextHandler(ServletContextHandler.NO_SESSIONS);
servContext.setContextPath("/");
server.setHandler(servContext);
server.start();
我在 org.eclipse.jetty 中打开了调试日志,在任何请求下我都会得到以下信息:
Selector loop woken up from select, 0/1 selected [] [io.ManagedSelector][jetty-default-3]
Running action org.eclipse.jetty.io.ManagedSelector$Accept@4278b8a5 [][io.ManagedSelector] [jetty-default-3]
Queued change org.eclipse.jetty.io.ManagedSelector$CreateEndPoint@535fb063 on org.eclipse.jetty.io.ManagedSelector@3959754c id=3 keys=2 selected=0 [] [io.ManagedSelector] [jetty-default-3]
EatWhatYouKill@1289003f/org.eclipse.jetty.io.ManagedSelector$SelectorProducer@7ff1b622/PRODUCING/0/1->PRODUCING/0/1 PEC org.eclipse.jetty.io.ManagedSelector$CreateEndPoint@535fb063 [] [strategy.EatWhatYouKill] [jetty-default-3]
Selector loop waiting on select [] [io.ManagedSelector] [jetty-default-3]
当只添加一个连接器时,一切都按预期工作。
附:所以问题"Selector loop waiting on select" when running multiple test cases which use wiremock stubs 和Jetty+Jersey infinite loop with curl post query 没有给出任何答案,除了它是 9.3 中修复的码头错误(我使用 9.4.3)
【问题讨论】:
-
你在做什么,你分享的链接在做什么是不同的。该链接正确使用了 2 个嵌套的 HttpConfiguration 对象,但您没有。
-
我改了代码,使用了嵌套对象,结果还是一样
-
事实上,我最终启动了两台 Jetty 服务器——一台使用 HTTP,一台使用 HTTPS。我相信 HTTP 工作正常,而后者在 ManagedSelector 中无法进入无限循环。
-
这也不正确。您将无法以一种有意义的方式在 http -> https 之间重定向(不保留服务器/应用程序/会话/请求上下文)
标签: java jetty embedded-jetty jetty-9