Jetty服务器9.4.30在特定请求数后停止响应。

huangapple 未分类评论56阅读模式
英文:

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();
        }
    }
}

huangapple
  • 本文由 发表于 2020年7月27日 20:59:26
  • 转载请务必保留本文链接:https://java.coder-hub.com/63115860.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定