【问题标题】:Load data to Ehcache 3 on Spring Boot start up在 Spring Boot 启动时将数据加载到 Ehcache 3
【发布时间】:2019-10-31 11:59:48
【问题描述】:
【问题讨论】:
标签:
java
spring-boot
ehcache-3
【解决方案1】:
在 Spring 上下文初始化后,我最终完成了它。
对于 DB 集合中的每个元素,我调用具有 @Cacheable 注释的 getResourceById(),从而填充整个 DB 集合的缓存。
我不建议在 @PostConstruct 中运行此代码,因为可能尚未创建代理,并且 @Cacheable 之类的注释可能还没有工作。
在触发 ContextRefreshedEvent 事件时(初始化或刷新后)运行此代码是加载缓存的更合适位置。
public class CacheLoader {
private final Logger logger = LoggerFactory.getLogger(CacheLoader.class);
@Autowired
private ResourcePermissionRepository resourcePermissionRepository;
@Autowired
private ResourcePermissionService resourcePermissionService;
@EventListener
public void onApplicationEvent(ContextRefreshedEvent event) {
logger.info("Loading cache following start/refresh event");
for (PermissionGroup permissionGroup : permissionGroupRepository.findAll()) {
permissionGroupService.getGroupById(permissionGroup.getGroupName());
}
for(ResourcePermission resourcePermission: resourcePermissionRepository.findAll()) {
resourcePermissionService.getResourceById(resourcePermission.getResourceId());
}
logger.info("Finished loading cache");
}
public class ResourcePermissionService {
private final Logger logger = LoggerFactory.getLogger(ResourcePermissionService.class);
@Autowired
private ResourcePermissionRepository resourcePermissionRepository;
@Cacheable(value = "resources", sync = true)
public ResourcePermission getResourceById(String resourceId) {
logger.info("Cache miss for resource " + resourceId);
return resourcePermissionRepository.findById(resourceId).orElse(new NullResourcePermission());
}
@CachePut(value = "resources", key = "#result.resourceId")
public ResourcePermission addResourcePermission(ResourcePermission resourcePermission) {
return resourcePermissionRepository.save(resourcePermission);
}
@CacheEvict(value = "resources")
public void deleteById(String resourceId) {
resourcePermissionRepository.deleteById(resourceId);
}
}