Skip to content

Commit

Permalink
(feat) enable redis cache on application, embedded cache on tests
Browse files Browse the repository at this point in the history
  • Loading branch information
jonathanlermitage committed Mar 18, 2018
1 parent 04f991f commit a911f6a
Show file tree
Hide file tree
Showing 14 changed files with 134 additions and 11 deletions.
20 changes: 19 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<surefireArgLine>
-ea -Xms128m -Xmx512m -Dspring.profiles.active=test,metrics -Dfile.encoding=UTF-8
-ea -Xms128m -Xmx512m -Dspring.profiles.active=test,metrics,embeddedcache -Dfile.encoding=UTF-8
-Djava.awt.headless=true -XX:CompileThreshold=1500
</surefireArgLine>

Expand Down Expand Up @@ -69,6 +69,9 @@
<!-- Aspect -->
<aspectjrt.version>1.8.13</aspectjrt.version>

<!-- Caching -->
<jedis.version>2.9.0</jedis.version>

<!-- Spring -->
<spring-boot.version>2.0.0.RELEASE</spring-boot.version>
<spring-framework.version>5.0.4.RELEASE</spring-framework.version>
Expand All @@ -77,6 +80,7 @@
<spring-security-web.version>5.0.3.RELEASE</spring-security-web.version>
<spring-batch-test.version>4.0.1.RELEASE</spring-batch-test.version>
<spring-boot-devtools.version>2.0.0.RELEASE</spring-boot-devtools.version>
<spring-data-redis.version>2.0.5.RELEASE</spring-data-redis.version>

<commons-lang3.version>3.7</commons-lang3.version>
<springfox-swagger.version>2.7.0</springfox-swagger.version>
Expand Down Expand Up @@ -200,6 +204,20 @@
<version>${aspectjrt.version}</version>
</dependency>

<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<!-- Spring Cache. -->
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>${spring-data-redis.version}</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>

<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<!-- Spring Security. -->
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/manon/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.core.env.Environment;
import org.springframework.data.mongodb.config.EnableMongoAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;
Expand All @@ -20,12 +22,14 @@
import java.util.List;

import static manon.app.config.SpringProfiles.METRICS;
import static manon.app.info.service.InfoServiceImpl.CACHE_GET_APPVERSION;
import static manon.app.trace.document.AppTrace.Event.APP_START;
import static manon.app.trace.document.AppTrace.Level.INFO;

@SpringBootApplication
@EnableMongoAuditing
@EnableScheduling
@EnableCaching
@Slf4j
@RequiredArgsConstructor
public class Application extends SpringBootServletInitializer {
Expand All @@ -45,6 +49,7 @@ protected SpringApplicationBuilder configure(SpringApplicationBuilder applicatio
}

@PostConstruct
@CacheEvict(value = CACHE_GET_APPVERSION, allEntries = true)
public void initApp() throws UserExistsException {
String initAppEvent = "Admin username is " + userAdminService.ensureAdmin().getUsername();
appTraceService.log(INFO, APP_START, initAppEvent);
Expand Down
28 changes: 28 additions & 0 deletions src/main/java/manon/app/cache/CommonCacheConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package manon.app.cache;

import org.jetbrains.annotations.NotNull;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CommonCacheConfig {

/** Key generator name: generate a unique key of the class name, the method name, and all method parameters appended. */
public static final String KEY_GENERATOR_FULL = "KEY_GENERATOR_FULL";

/** Generate a unique key of the class name, the method name, and all method parameters appended. */
@NotNull
@Bean(name = KEY_GENERATOR_FULL)
public KeyGenerator keyGenerator() {
return (o, method, objects) -> {
StringBuilder sb = new StringBuilder();
sb.append(o.getClass().getName());
sb.append(method.getName());
for (Object obj : objects) {
sb.append(obj.toString());
}
return sb.toString();
};
}
}
22 changes: 22 additions & 0 deletions src/main/java/manon/app/cache/EmbeddedCacheConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package manon.app.cache;

import org.jetbrains.annotations.NotNull;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

import static manon.app.config.SpringProfiles.EMBEDDED_CACHE;

@Configuration
@Profile(EMBEDDED_CACHE)
public class EmbeddedCacheConfig extends CachingConfigurerSupport {

@NotNull
@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager();
}
}
28 changes: 28 additions & 0 deletions src/main/java/manon/app/cache/RedisCacheConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package manon.app.cache;

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.core.RedisTemplate;

import java.time.Duration;

import static manon.app.config.SpringProfiles.REDIS_CACHE;

@Configuration
@Profile(REDIS_CACHE)
public class RedisCacheConfig extends CachingConfigurerSupport {

@Bean
public RedisCacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(1))
.prefixKeysWith("manon_");
return RedisCacheManager.builder(redisTemplate.getConnectionFactory())
.cacheDefaults(config)
.build();
}
}
8 changes: 7 additions & 1 deletion src/main/java/manon/app/config/SpringProfiles.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,11 @@ public interface SpringProfiles {
String METRICS = "metrics";

/** {@value}. */
String NO_METRICS = "!metrics";
String NOT_METRICS = "!metrics";

/** {@value}. */
String REDIS_CACHE = "!embeddedcache";

/** {@value}. */
String EMBEDDED_CACHE = "embeddedcache";
}
4 changes: 2 additions & 2 deletions src/main/java/manon/app/config/WebConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@EnableWebMvc
@EnableAsync
public class WebConfig extends WebMvcConfigurerAdapter {
public class WebConfig implements WebMvcConfigurer {

public WebConfig() {
super();
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/manon/app/info/service/InfoServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;

Expand All @@ -10,9 +11,12 @@
@PropertySource(value = "classpath:info.properties")
public class InfoServiceImpl implements InfoService {

public static final String CACHE_GET_APPVERSION = "CACHE_GET_APPVERSION";

@Value("${version}")
private String version;

@Cacheable(CACHE_GET_APPVERSION)
@Override
public String getAppVersion() {
return version;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Service;

import static manon.app.config.SpringProfiles.NO_METRICS;
import static manon.app.config.SpringProfiles.NOT_METRICS;

@Service
@Profile(NO_METRICS)
@Profile(NOT_METRICS)
public class NoPerformanceRecorder implements PerformanceRecorder {

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class FriendshipServiceImpl implements FriendshipService {
private final UserService userService;

@Override
public void keepEvents(String... ids) throws UserNotFoundException {
public void keepEvents(String... ids) {
for (String id : ids) {
userRepository.keepEvents(id, MAX_EVENTS);
}
Expand Down Expand Up @@ -54,19 +54,19 @@ public void acceptFriendshipRequest(String userIdFrom, String userIdTo)
}

@Override
public void rejectFriendshipRequest(String userIdFrom, String userIdTo) throws UserNotFoundException {
public void rejectFriendshipRequest(String userIdFrom, String userIdTo) {
userRepository.rejectFriendshipRequest(userIdFrom, userIdTo);
keepEvents(userIdFrom, userIdTo);
}

@Override
public void cancelFriendshipRequest(String userIdFrom, String userIdTo) throws UserNotFoundException {
public void cancelFriendshipRequest(String userIdFrom, String userIdTo) {
userRepository.cancelFriendshipRequest(userIdFrom, userIdTo);
keepEvents(userIdFrom, userIdTo);
}

@Override
public void revokeFriendship(String userIdFrom, String userIdTo) throws UserNotFoundException {
public void revokeFriendship(String userIdFrom, String userIdTo) {
userRepository.revokeFriendship(userIdFrom, userIdTo);
keepEvents(userIdFrom, userIdTo);
}
Expand Down
4 changes: 4 additions & 0 deletions src/main/resources/application-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,7 @@ spring:
password: woot
url: jdbc:mysql://127.0.0.1:3307/manon_dev?useUnicode=true&characterEncoding=utf8&autoReconnect=true
jpa.hibernate.ddl-auto: create-drop
redis:
database: 2
host: localhost
port: 6379
4 changes: 4 additions & 0 deletions src/main/resources/application-prod.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,10 @@ spring:
username: ${MANON_PROD_MONGODB_USERNAME}
password: ${MANON_PROD_MONGODB_PASSWORD}
authentication-database: ${MANON_PROD_MONGODB_AUTH_DB_NAME}
redis:
database: ${MANON_PROD_REDIS_DB_NUMBER}
host: ${MANON_PROD_REDIS_HOST}
port: ${MANON_PROD_REDIS_PORT}

manon:
admin:
Expand Down
4 changes: 3 additions & 1 deletion src/test/java/manon/app/actuator/ActuatorTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import static org.apache.http.HttpStatus.SC_UNAUTHORIZED;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.equalToIgnoringWhiteSpace;
import static org.hamcrest.Matchers.not;
import static org.springframework.http.HttpMethod.GET;
import static org.springframework.http.HttpMethod.POST;

Expand Down Expand Up @@ -67,7 +68,8 @@ public void shouldGetFullHealthActuatorWhenAdmin() {
containsString("\"status\""),
containsString("\"diskSpace\""),
containsString("\"mongo\""),
containsString("\"db\"")
containsString("\"db\""),
not(containsString("\"redis\"")) // tests use embedded cache, not Redis
);
}

Expand Down
2 changes: 2 additions & 0 deletions src/test/resources/application-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,5 @@ manon:
security.bcrypt.strength: 4
batch:
user-snapshot.chunk: 10

management.health.redis.enabled: false # disable Redis health check since we prefer embedded cache provider

0 comments on commit a911f6a

Please sign in to comment.