我正在开发与REST兼容且与JAX-RS库兼容的嵌入式码头服务器。 但是奇怪的是服务器在1800到2000个请求后停止响应,没有任何错误代码或引发异常。 数据传输是一堆protobuff MapBox矢量图块。尽管即使将空数据传递给客户端,问题仍然存在,而且我几乎可以确定问题不是由于数据库连接池引起的。 Jetty版本是9.4.30.v20200611,启动服务器的代码如下:
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();
}
}
}