diff --git a/initializr-service/pom.xml b/initializr-service/pom.xml index d1e9e384..ec055246 100644 --- a/initializr-service/pom.xml +++ b/initializr-service/pom.xml @@ -26,6 +26,15 @@ initializr-actuator + + javax.cache + cache-api + + + org.ehcache + ehcache + + org.springframework.boot spring-boot-devtools diff --git a/initializr-service/src/main/java/io/spring/initializr/service/InitializrService.java b/initializr-service/src/main/java/io/spring/initializr/service/InitializrService.java index 021e7bae..dc57ce57 100644 --- a/initializr-service/src/main/java/io/spring/initializr/service/InitializrService.java +++ b/initializr-service/src/main/java/io/spring/initializr/service/InitializrService.java @@ -23,6 +23,7 @@ import io.spring.initializr.web.project.LegacyStsController; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurerSupport; @@ -37,6 +38,7 @@ import org.springframework.web.servlet.resource.ResourceUrlProvider; * @author Stephane Nicoll */ @SpringBootApplication +@EnableCaching public class InitializrService { public static void main(String[] args) { diff --git a/initializr-web/pom.xml b/initializr-web/pom.xml index de763af3..a5944a07 100644 --- a/initializr-web/pom.xml +++ b/initializr-web/pom.xml @@ -19,12 +19,13 @@ org.springframework.boot - spring-boot-autoconfigure + spring-boot-starter-mustache - org.springframework - spring-context-support + org.springframework.boot + spring-boot-starter-cache + org.springframework spring-webmvc @@ -33,10 +34,6 @@ org.springframework.hateoas spring-hateoas - - com.github.ben-manes.caffeine - caffeine - org.apache.ant ant @@ -45,10 +42,11 @@ org.json json - + - org.springframework.boot - spring-boot-starter-mustache + javax.cache + cache-api + true diff --git a/initializr-web/src/main/java/io/spring/initializr/web/autoconfigure/InitializrAutoConfiguration.java b/initializr-web/src/main/java/io/spring/initializr/web/autoconfigure/InitializrAutoConfiguration.java index 27351dd4..1ba9c259 100644 --- a/initializr-web/src/main/java/io/spring/initializr/web/autoconfigure/InitializrAutoConfiguration.java +++ b/initializr-web/src/main/java/io/spring/initializr/web/autoconfigure/InitializrAutoConfiguration.java @@ -17,11 +17,11 @@ package io.spring.initializr.web.autoconfigure; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import java.util.concurrent.TimeUnit; +import javax.cache.configuration.MutableConfiguration; +import javax.cache.expiry.CreatedExpiryPolicy; +import javax.cache.expiry.Duration; -import com.github.benmanes.caffeine.cache.Caffeine; import io.spring.initializr.generator.ProjectGenerator; import io.spring.initializr.generator.ProjectRequestPostProcessor; import io.spring.initializr.generator.ProjectRequestResolver; @@ -38,15 +38,13 @@ import io.spring.initializr.web.support.DefaultInitializrMetadataProvider; import io.spring.initializr.web.ui.UiController; import org.springframework.beans.factory.ObjectProvider; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration; +import org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.cache.Cache; -import org.springframework.cache.CacheManager; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.cache.caffeine.CaffeineCache; -import org.springframework.cache.concurrent.ConcurrentMapCache; -import org.springframework.cache.support.SimpleCacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; @@ -65,9 +63,9 @@ import org.springframework.web.servlet.resource.ResourceUrlProvider; * @author Stephane Nicoll */ @Configuration -@EnableCaching @EnableConfigurationProperties(InitializrProperties.class) -public class InitializrAutoConfiguration { +@AutoConfigureAfter(CacheAutoConfiguration.class) +public class InitializrAutoConfiguration { private final List postProcessors; @@ -144,22 +142,26 @@ public class InitializrAutoConfiguration { return new DefaultDependencyMetadataProvider(); } - @Bean - @ConditionalOnMissingBean - public CacheManager cacheManager() { - SimpleCacheManager cacheManager = new SimpleCacheManager(); - cacheManager.setCaches(Arrays.asList( - createConcurrentMapCache(600L, "initializr"), - new ConcurrentMapCache("dependency-metadata"), - new ConcurrentMapCache("project-resources"))); - return cacheManager; - } + @Configuration + @ConditionalOnClass(javax.cache.CacheManager.class) + static class CacheConfiguration { + + @Bean + public JCacheManagerCustomizer initializrCacheManagerCustomizer() { + return cm -> { + cm.createCache("initializr", config().setExpiryPolicyFactory( + CreatedExpiryPolicy.factoryOf(Duration.TEN_MINUTES))); + cm.createCache("dependency-metadata", config()); + cm.createCache("project-resources", config()); + }; + } + + private MutableConfiguration config() { + return new MutableConfiguration<>() + .setStoreByValue(false) + .setManagementEnabled(true).setStatisticsEnabled(true); + } - private static Cache createConcurrentMapCache(Long timeToLive, String name) { - return new CaffeineCache(name, Caffeine - .newBuilder() - .expireAfterWrite(timeToLive, TimeUnit.SECONDS) - .build()); } }