@Override public void run() { final long nowMs = dateProvider.now().getTime(); Map<Class<? extends HttpServlet>, ServletStats> stats = getServletStats(); if (stats.keySet().size() == 0) { LOGGER.info("Running outdated servlets check - no servlets registered."); return; } LOGGER.info("Running outdated servlets check."); for (Map.Entry<Class<? extends HttpServlet>, ServletStats> entry : stats.entrySet()) { if (nowMs - entry.getValue().getLastRequestedAt().getTime() > servletTimeToLiveInMs) { LOGGER.info("Destroying outdated servlet " + entry.getKey().getName()); shutdownServlet(servlets.get(entry.getKey())); } } } }, monitoringIntervalInMs, monitoringIntervalInMs);
/** * {@inheritDoc} */ @Override public Servlet getServletForClass(final Class<? extends HttpServlet> servletClass, final ServletConfig servletConfig) throws ServletInitializationException, ServletException { if (servlets.containsKey(servletClass)) { servletStats.get(servletClass).setLastRequestedAt(dateProvider.now()); return servlets.get(servletClass); } return initializeServlet(servletClass, servletConfig); }
/** * {@inheritDoc} */ @Override public Filter getFilterForClass(final Class<? extends Filter> filterClass, final FilterConfig filterConfig) throws FilterInitializationException, ServletException { if (filters.containsKey(filterClass)) { return filters.get(filterClass); } Filter filter = instantiateFilter(filterClass); filter.init(filterConfig); filters.put(filterClass, filter); return filter; }
@Test public void shouldShutdownProperly() throws ServletException, ServletInitializationException { SampleServlet servlet = (SampleServlet) servletContainer.getServletForClass(SampleServlet.class, servletConfig); assertThat(servletContainer.getServletStats().size(), is(1)); servletContainer.shutdown(); assertThat(servletContainer.getServletStats().size(), is(0)); assertThat(servlet.getDestroyedCounter(), is(equalTo(1))); }
@Test public void shouldDestroyOutdatedServlet() throws ServletException, ServletInitializationException, InterruptedException { servletContainer = new ServletContainerImpl(new DateProvider(), 50, 50); SampleServlet servlet = (SampleServlet) servletContainer.getServletForClass(SampleServlet.class, servletConfig); assertThat(servlet, is(not(nullValue()))); Thread.sleep(200); SampleServlet servlet2 = (SampleServlet) servletContainer.getServletForClass(SampleServlet.class, servletConfig); assertThat(servlet, is(not(nullValue()))); assertThat(servlet == servlet2, is(false)); }
@Test public void shouldReturnServletFromPool() throws ServletException, ServletInitializationException { SampleServlet servlet = (SampleServlet) servletContainer.getServletForClass(SampleServlet.class, servletConfig); assertThat(servlet, is(not(nullValue()))); assertThat(servlet.getInitializedCounter(), is(equalTo(1))); assertThat(servlet.getServletConfig(), is(equalTo(servletConfig))); assertThat(servletContainer.getServletStats().size(), is(1)); SampleServlet servlet2 = (SampleServlet) servletContainer.getServletForClass(SampleServlet.class, servletConfig); assertThat(servlet2, is(servlet)); assertThat(servlet2.getInitializedCounter(), is(equalTo(1))); assertThat(servletContainer.getServletStats().size(), is(1)); assertThat(servlet2.getDestroyedCounter(), is(equalTo(0))); }
private ServletResourceProvider getServletResourceProvider(final ServerConfig serverConfig) { return new ServletResourceProvider( new ServletContainerImpl(new DateProvider(), SERVLET_TIME_TO_LIVE_IN_MS, MONITORING_INTERVAL_IN_MS), getServletContexts(serverConfig) ); } }
@Test(expected = ServletInitializationException.class) public void shouldThrowException() throws ServletException, ServletInitializationException { servletContainer.getServletForClass(InvalidServletWithPrivateConstructor.class, servletConfig); }
/** * Destroys all initialized servlets. */ @Override public void shutdown() { for (Map.Entry<Class<? extends HttpServlet>, Servlet> entry : servlets.entrySet()) { shutdownServlet(entry.getValue()); } timer.cancel(); }
private Servlet initializeServlet(final Class<? extends HttpServlet> serverClass, final ServletConfig servletConfig) throws ServletInitializationException, ServletException { Servlet servlet = instantiateServlet(serverClass); servlet.init(servletConfig); servlets.put(serverClass, servlet); servletStats.put(serverClass, new ServletStats()); return servlet; }
@Before public void setUp() { servletContainer = new ServletContainerImpl(new DateProvider(), 0, 0); servletConfig = mock(ServletConfig.class); }
@Test public void shouldInitializeServlet() throws ServletException, ServletInitializationException { SampleServlet servlet = (SampleServlet) servletContainer.getServletForClass(SampleServlet.class, servletConfig); assertThat(servlet, is(not(nullValue()))); assertThat(servlet.getInitializedCounter(), is(equalTo(1))); assertThat(servlet.getServletConfig(), is(equalTo(servletConfig))); }