|
|
@ -1,10 +1,8 @@ |
|
|
|
package org.libresonic.player.boot; |
|
|
|
package org.libresonic.player.boot; |
|
|
|
|
|
|
|
|
|
|
|
import net.sf.ehcache.constructs.web.ShutdownListener; |
|
|
|
import net.sf.ehcache.constructs.web.ShutdownListener; |
|
|
|
import org.apache.catalina.Container; |
|
|
|
|
|
|
|
import org.apache.catalina.Wrapper; |
|
|
|
|
|
|
|
import org.apache.catalina.webresources.StandardRoot; |
|
|
|
|
|
|
|
import org.directwebremoting.servlet.DwrServlet; |
|
|
|
import org.directwebremoting.servlet.DwrServlet; |
|
|
|
|
|
|
|
import org.libresonic.player.Logger; |
|
|
|
import org.libresonic.player.filter.*; |
|
|
|
import org.libresonic.player.filter.*; |
|
|
|
import org.libresonic.player.spring.LibresonicPropertySourceConfigurer; |
|
|
|
import org.libresonic.player.spring.LibresonicPropertySourceConfigurer; |
|
|
|
import org.springframework.boot.autoconfigure.SpringBootApplication; |
|
|
|
import org.springframework.boot.autoconfigure.SpringBootApplication; |
|
|
@ -16,18 +14,19 @@ import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfigurati |
|
|
|
import org.springframework.boot.builder.SpringApplicationBuilder; |
|
|
|
import org.springframework.boot.builder.SpringApplicationBuilder; |
|
|
|
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; |
|
|
|
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; |
|
|
|
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; |
|
|
|
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; |
|
|
|
import org.springframework.boot.context.embedded.tomcat.TomcatContextCustomizer; |
|
|
|
|
|
|
|
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; |
|
|
|
|
|
|
|
import org.springframework.boot.web.servlet.FilterRegistrationBean; |
|
|
|
import org.springframework.boot.web.servlet.FilterRegistrationBean; |
|
|
|
import org.springframework.boot.web.servlet.ServletRegistrationBean; |
|
|
|
import org.springframework.boot.web.servlet.ServletRegistrationBean; |
|
|
|
import org.springframework.boot.web.support.SpringBootServletInitializer; |
|
|
|
import org.springframework.boot.web.support.SpringBootServletInitializer; |
|
|
|
import org.springframework.context.annotation.Bean; |
|
|
|
import org.springframework.context.annotation.Bean; |
|
|
|
import org.springframework.context.annotation.Configuration; |
|
|
|
import org.springframework.context.annotation.Configuration; |
|
|
|
import org.springframework.context.annotation.ImportResource; |
|
|
|
import org.springframework.context.annotation.ImportResource; |
|
|
|
|
|
|
|
import org.springframework.util.ReflectionUtils; |
|
|
|
|
|
|
|
|
|
|
|
import javax.servlet.Filter; |
|
|
|
import javax.servlet.Filter; |
|
|
|
import javax.servlet.ServletContextListener; |
|
|
|
import javax.servlet.ServletContextListener; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.lang.reflect.Method; |
|
|
|
|
|
|
|
|
|
|
|
@SpringBootApplication(exclude = { |
|
|
|
@SpringBootApplication(exclude = { |
|
|
|
JmxAutoConfiguration.class, |
|
|
|
JmxAutoConfiguration.class, |
|
|
|
JdbcTemplateAutoConfiguration.class, |
|
|
|
JdbcTemplateAutoConfiguration.class, |
|
|
@ -41,6 +40,8 @@ import javax.servlet.ServletContextListener; |
|
|
|
"classpath:/libresonic-servlet.xml"}) |
|
|
|
"classpath:/libresonic-servlet.xml"}) |
|
|
|
public class Application extends SpringBootServletInitializer implements EmbeddedServletContainerCustomizer { |
|
|
|
public class Application extends SpringBootServletInitializer implements EmbeddedServletContainerCustomizer { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static final Logger LOG = Logger.getLogger(Application.class); |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Registers the DWR servlet. |
|
|
|
* Registers the DWR servlet. |
|
|
|
* |
|
|
|
* |
|
|
@ -186,29 +187,28 @@ public class Application extends SpringBootServletInitializer implements Embedde |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void customize(ConfigurableEmbeddedServletContainer container) { |
|
|
|
public void customize(ConfigurableEmbeddedServletContainer container) { |
|
|
|
if (container instanceof TomcatEmbeddedServletContainerFactory) { |
|
|
|
// Yes, there is a good reason we do this.
|
|
|
|
TomcatEmbeddedServletContainerFactory tomcatFactory = (TomcatEmbeddedServletContainerFactory) container; |
|
|
|
// We cannot count on the tomcat classes being on the classpath which will
|
|
|
|
tomcatFactory.addContextCustomizers((TomcatContextCustomizer) context -> { |
|
|
|
// happen if the war is deployed to another app server like Jetty. So, we
|
|
|
|
|
|
|
|
// ensure this class does not have any direct dependencies on any Tomcat
|
|
|
|
// Increase the size and time before eviction of the Tomcat
|
|
|
|
// specific classes.
|
|
|
|
// cache so that resources aren't uncompressed too often.
|
|
|
|
try { |
|
|
|
// See https://github.com/jhipster/generator-jhipster/issues/3995
|
|
|
|
Class<?> tomcatESCF = Class.forName("org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory"); |
|
|
|
StandardRoot resources = new StandardRoot(); |
|
|
|
if(tomcatESCF.isInstance(container)) { |
|
|
|
resources.setCacheMaxSize(100000); |
|
|
|
LOG.debug("Attempting to optimize tomcat"); |
|
|
|
resources.setCacheObjectMaxSize(4000); |
|
|
|
Object tomcatESCFInstance = tomcatESCF.cast(container); |
|
|
|
resources.setCacheTtl(24 * 3600 * 1000); // 1 day, in milliseconds
|
|
|
|
Class<?> tomcatApplicationClass = Class.forName("org.libresonic.player.boot.TomcatApplication"); |
|
|
|
context.setResources(resources); |
|
|
|
Method configure = ReflectionUtils.findMethod(tomcatApplicationClass, "configure", tomcatESCF); |
|
|
|
|
|
|
|
configure.invoke(null, tomcatESCFInstance); |
|
|
|
// Put Jasper in production mode so that JSP aren't recompiled
|
|
|
|
LOG.debug("Tomcat optimizations complete"); |
|
|
|
// on each request.
|
|
|
|
} else { |
|
|
|
// See http://stackoverflow.com/questions/29653326/spring-boot-application-slow-because-of-jsp-compilation
|
|
|
|
LOG.debug("Skipping tomcat optimization as we are not running on tomcat"); |
|
|
|
Container jsp = context.findChild("jsp"); |
|
|
|
} |
|
|
|
if (jsp instanceof Wrapper) { |
|
|
|
} catch (ClassNotFoundException e) { |
|
|
|
((Wrapper)jsp).addInitParameter("development", "false"); |
|
|
|
LOG.debug("Skipping tomcat optimization as the tomcat classes are not available"); |
|
|
|
} |
|
|
|
} catch (Exception e) { |
|
|
|
}); |
|
|
|
LOG.warn("An error happened while trying to optimize tomcat", e); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static void main(String[] args) { |
|
|
|
public static void main(String[] args) { |
|
|
|