英文:
Jetty server 9.4.30 stops responding after a specific number of requests
问题
以下是您提供的代码的中文翻译:
package org.maps.server;
import org.eclipse.jetty.server.*;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlets.CrossOriginFilter;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.glassfish.jersey.servlet.ServletContainer;
import org.maps.server.rest.MBTiles;
import org.maps.server.rest.MapLayers;
import javax.servlet.DispatcherType;
import java.util.EnumSet;
import java.util.Objects;
public class JettyServerApp {
public static void main(String[] args) throws Exception {
ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS | ServletContextHandler.NO_SECURITY);
contextHandler.setContextPath("/");
// 启用CORS
FilterHolder cors = contextHandler.addFilter(CrossOriginFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
cors.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
cors.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, "*");
cors.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,POST,HEAD");
cors.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "X-Requested-With,Content-Type,Accept,Origin");
// 欢迎页面文件
ServletHolder def = new ServletHolder("default", DefaultServlet.class);
def.setInitParameter("resourceBase", "./http/");
def.setInitParameter("dirAllowed", "false");
contextHandler.addServlet(def, "/");
contextHandler.setWelcomeFiles(new String[]{"index.html"});
ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setDirectoriesListed(true);
resourceHandler.setWelcomeFiles(new String[]{"index.html"});
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[]{contextHandler, new DefaultHandler()});
// 初始化线程池
QueuedThreadPool threadPool = new QueuedThreadPool();
threadPool.setMinThreads(10);
threadPool.setMaxThreads(1000);
threadPool.setIdleTimeout(120);
Server jettyServer = new Server(threadPool);
jettyServer.setHandler(handlers);
ServerConnector http = new ServerConnector(jettyServer);
http.setPort(9003);
jettyServer.addConnector(http);
// 在嵌入式Jetty中启用SSL
HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSecureScheme("https");
httpConfig.setSecurePort(Integer.parseInt(Objects.requireNonNull(PropertyValues.getProperty("port"))));
HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);
httpsConfig.addCustomizer(new SecureRequestCustomizer());
SslContextFactory.Server sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setExcludeCipherSuites("^.*_(MD5|SHA|SHA1)$");
ServletHolder jerseyServlet = contextHandler.addServlet(
ServletContainer.class, "/*");
jerseyServlet.setInitParameter(
"jersey.config.server.provider.classnames",
MBTiles.class.getCanonicalName() +
"," + MainPage.class.getCanonicalName() +
"," + MapLayers.class.getCanonicalName());
try {
jettyServer.start();
jettyServer.join();
} catch (Exception e) {
e.printStackTrace();
jettyServer.stop();
jettyServer.destroy();
}
}
}
英文:
I'm developing an embedded jetty server with REST compatibility with JAX-RS library.
But weirdly server stops responding after 1800 to 2000 requests without any error code or throwing an exception.
The data transferring is a bunch of protobuff MapBox vector tiles. Although with passing even empty data to the client the problem exists and I'm almost confident that the problem isn't because of database connection pooling.
Jetty version is 9.4.30.v20200611 and the code to start the server is as follows:
package org.maps.server;
import org.eclipse.jetty.server.*;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlets.CrossOriginFilter;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.glassfish.jersey.servlet.ServletContainer;
import org.maps.server.rest.MBTiles;
import org.maps.server.rest.MapLayers;
import javax.servlet.DispatcherType;
import java.util.EnumSet;
import java.util.Objects;
public class JettyServerApp {
public static void main(String[] args) throws Exception {
ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS | ServletContextHandler.NO_SECURITY);
contextHandler.setContextPath("/");
//Enable CORS
FilterHolder cors = contextHandler.addFilter(CrossOriginFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
cors.setInitParameter(CrossOriginFilter.ALLOWED_ORIGINS_PARAM, "*");
cors.setInitParameter(CrossOriginFilter.ACCESS_CONTROL_ALLOW_ORIGIN_HEADER, "*");
cors.setInitParameter(CrossOriginFilter.ALLOWED_METHODS_PARAM, "GET,POST,HEAD");
cors.setInitParameter(CrossOriginFilter.ALLOWED_HEADERS_PARAM, "X-Requested-With,Content-Type,Accept,Origin");
// Welcome files
ServletHolder def = new ServletHolder("default", DefaultServlet.class);
def.setInitParameter("resourceBase", "./http/");
def.setInitParameter("dirAllowed", "false");
contextHandler.addServlet(def, "/");
contextHandler.setWelcomeFiles(new String[]{"index.html"});
ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setDirectoriesListed(true);
resourceHandler.setWelcomeFiles(new String[]{"index.html"});
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[]{contextHandler, new DefaultHandler()});
// initializing thread pool
QueuedThreadPool threadPool = new QueuedThreadPool();
threadPool.setMinThreads(10);
threadPool.setMaxThreads(1000);
threadPool.setIdleTimeout(120);
Server jettyServer = new Server(threadPool);
jettyServer.setHandler(handlers);
ServerConnector http = new ServerConnector(jettyServer);
http.setPort(9003);
jettyServer.addConnector(http);
// Enabling SSL in Embedded Jetty
HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSecureScheme("https");
httpConfig.setSecurePort(Integer.parseInt(Objects.requireNonNull(PropertyValues.getProperty("port"))));
HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);
httpsConfig.addCustomizer(new SecureRequestCustomizer());
SslContextFactory.Server sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setExcludeCipherSuites("^.*_(MD5|SHA|SHA1)$");
ServletHolder jerseyServlet = contextHandler.addServlet(
ServletContainer.class, "/*");
jerseyServlet.setInitParameter(
"jersey.config.server.provider.classnames",
MBTiles.class.getCanonicalName() +
"," + MainPage.class.getCanonicalName() +
"," + MapLayers.class.getCanonicalName());
try {
jettyServer.start();
jettyServer.join();
} catch (Exception e) {
e.printStackTrace();
jettyServer.stop();
jettyServer.destroy();
}
}
}
专注分享java语言的经验与见解,让所有开发者获益!
评论