我希望在Spring Boot应用程序启动时加载缓存中的数据。我知道在Ehcache2中有一种使用BootstrapCacheLoader的集成方法。但是我在Ehcache3中看不到这个。我仍然可以在@postConstruct方法中手动完成。但是我想知道是否有一个集成的解决方案(Spring 5,Ehcache 3)
谢谢。
发布于 2019-11-01 14:36:10
在初始化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);
}
}
https://stackoverflow.com/questions/58642911
复制相似问题