package org.langke.core.server; import java.util.EventListener; import java.util.HashMap; import java.util.Map; import javax.servlet.Filter; import org.langke.common.Config; import org.langke.util.logging.ESLogger; import org.langke.util.logging.Loggers; import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; import org.mortbay.jetty.Server; import org.mortbay.jetty.bio.SocketConnector; import org.mortbay.jetty.handler.ContextHandlerCollection; import org.mortbay.jetty.handler.ResourceHandler; import org.mortbay.jetty.servlet.Context; import org.mortbay.jetty.servlet.DefaultServlet; import org.mortbay.jetty.servlet.FilterHolder; import org.mortbay.thread.QueuedThreadPool; /** * 启动一个jetty容器,结合javamelody用于监控应用性能 * @author langke * 2012-12-21 */ public class JavaMelodyMonitorServer { private ESLogger log = Loggers.getLogger(JavaMelodyMonitorServer.class); Server webServer; /** * * @param serverName 应用名称 * @param host 绑定的IP地址 * @param serverPort 应用端口,jetty启动的端口默认会在此基础上加1000,如果配置文件有配置jetty.listen.port则配置优先 */ public JavaMelodyMonitorServer(String serverName,String host,int serverPort) { init(serverName, host, serverPort); start(); final JavaMelodyMonitorServer server = this; Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { try { log.info("shutdown mointorServer:{}", server); server.stop(); } catch (Exception e) { log.error("run main stop error!", e); } } }); } private void init(String serverName,String host,int serverPort){ int defaultValue = serverPort+1000; int port = Config.get().getInt("jetty.listen.port", defaultValue); Connector connector = new SocketConnector(); webServer = new Server(); QueuedThreadPool pool = new QueuedThreadPool(); pool.setMinThreads(Config.get().getInt("jetty.pool.MinThread", 3)); pool.setMaxThreads(Config.get().getInt("jetty.pool.MaxThread", 32)); String server = host; pool.setName(serverName+"-monitor"); pool.setDaemon(true); webServer.setThreadPool(pool); connector = new SocketConnector(); connector.setPort(port); connector.setHost(server); connector.setMaxIdleTime(60000); // 1 min webServer.addConnector(connector); ContextHandlerCollection col = new ContextHandlerCollection(); Context context = new Context(col, "/", Context.SESSIONS); ResourceHandler resourceHandler = new ResourceHandler(); webServer.setHandlers(new Handler[] {col,resourceHandler }); webServer.addHandler(context); // Set Java Melody storage Directory String user_dir = System.getProperty("user.dir",""); System.setProperty("javamelody.storage-directory", user_dir+"/logs/javamelody-"+pool.getName()); //add filter Filter monitoringFilter = new net.bull.javamelody.MonitoringFilter(); context.addFilter(new FilterHolder(monitoringFilter), "/monitoring", Handler.REQUEST); // Map<String,String> initParams = new HashMap<String,String>(); // initParams.put("contextConfigLocation", "classpath:net/bull/javamelody/monitoring-spring.xml,classpath:resource/*.xml,classpath:conf/applicationContext.xml"); // context.setInitParams(initParams); //add listener //EventListener listener = new ContextLoaderListener(); //context.addEventListener(listener); context.addServlet(DefaultServlet.class, "/*"); } public void start(){ try{ webServer.join(); webServer.start(); }catch (Exception e){ log.error("Error starting httpserver", e); } } public void stop(){ try{ webServer.stop(); webServer.destroy(); }catch (Exception e){ log.error("Error stop httpserver", e); } } }