com.zmops.zeus.server.jetty.JettyServer Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.zmops.zeus.server.jetty;
import com.zmops.zeus.server.Server;
import com.zmops.zeus.server.ServerException;
import com.zmops.zeus.server.library.web.WebFilter;
import com.zmops.zeus.server.library.web.util.PathKit;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.gzip.GzipHandler;
import org.eclipse.jetty.servlet.*;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.DispatcherType;
import java.util.EnumSet;
import java.util.Objects;
public class JettyServer implements Server {
private static final Logger LOGGER = LoggerFactory.getLogger(JettyServer.class);
private org.eclipse.jetty.server.Server server;
private ServletContextHandler servletContextHandler;
private final JettyServerConfig jettyServerConfig;
private final FilterHolder filterHolder = new FilterHolder();
public JettyServer(JettyServerConfig config) {
this.jettyServerConfig = config;
}
@Override
public String hostPort() {
return jettyServerConfig.getHost() + ":" + jettyServerConfig.getPort();
}
@Override
public String serverClassify() {
return "Jetty";
}
@Override
public void initialize() {
QueuedThreadPool threadPool = new QueuedThreadPool();
threadPool.setMinThreads(jettyServerConfig.getJettyMinThreads());
threadPool.setMaxThreads(jettyServerConfig.getJettyMaxThreads());
server = new org.eclipse.jetty.server.Server(threadPool);
HttpConfiguration httpConfiguration = new HttpConfiguration();
httpConfiguration.setRequestHeaderSize(jettyServerConfig.getJettyHttpMaxRequestHeaderSize());
ServerConnector connector = new ServerConnector(server, new HttpConnectionFactory(httpConfiguration));
connector.setHost(jettyServerConfig.getHost());
connector.setPort(jettyServerConfig.getPort());
connector.setIdleTimeout(jettyServerConfig.getJettyIdleTimeOut());
connector.setAcceptorPriorityDelta(jettyServerConfig.getJettyAcceptorPriorityDelta());
connector.setAcceptQueueSize(jettyServerConfig.getJettyAcceptQueueSize());
server.setConnectors(new Connector[]{connector});
servletContextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS);
servletContextHandler.setContextPath(jettyServerConfig.getContextPath());
LOGGER.info("http server root context path: {}", jettyServerConfig.getContextPath());
server.setHandler(servletContextHandler);
WebFilter webFilter = new WebFilter();
filterHolder.setFilter(webFilter);
String path = PathKit.getWebRootPath();
ServletHolder holderHome = new ServletHolder("static-home", DefaultServlet.class);
holderHome.setInitParameter("resourceBase", path + "/assets");
holderHome.setInitParameter("dirAllowed", "true");
holderHome.setInitParameter("pathInfoOnly", "true");
servletContextHandler.addServlet(holderHome, "/*");
servletContextHandler.setResourceBase(path);
servletContextHandler.addFilter(filterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
servletContextHandler.setGzipHandler(new GzipHandler());
}
public void setFilterInitParameter(String name, String parameter) {
filterHolder.setInitParameter(name, parameter);
}
@Override
public boolean isSSLOpen() {
return false;
}
@Override
public boolean isStatusEqual(Server target) {
return equals(target);
}
@Override
public void start() throws ServerException {
LOGGER.info("start server, host: {}, port: {}", jettyServerConfig.getHost(), jettyServerConfig.getPort());
try {
if (LOGGER.isDebugEnabled()) {
if (servletContextHandler.getServletHandler() != null && servletContextHandler.getServletHandler().getServletMappings() != null) {
for (ServletMapping servletMapping : servletContextHandler.getServletHandler().getServletMappings()) {
LOGGER.debug("jetty servlet mappings: {} register by {}", servletMapping.getPathSpecs(), servletMapping.getServletName());
}
}
}
server.start();
} catch (Exception e) {
throw new JettyServerException(e.getMessage(), e);
}
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
JettyServer that = (JettyServer) o;
return jettyServerConfig.getPort() == that.jettyServerConfig.getPort()
&& Objects.equals(jettyServerConfig.getHost(), that.jettyServerConfig.getHost());
}
@Override
public int hashCode() {
return Objects.hash(jettyServerConfig.getHost(), jettyServerConfig.getPort());
}
}