Загрузка данных в Ehcache 3 при запуске Spring Boot - PullRequest
0 голосов
/ 31 октября 2019

Я хочу загрузить данные в кеш при запуске приложения Spring Boot. Я знаю, что есть интегрированный способ использования BootstrapCacheLoader в Ehcache2. Как загрузить данные из базы данных в Ehcache при запуске приложения Но я не вижу этого в Ehcache3. Я все еще могу сделать это вручную в методе @postConstruct. Но мне было интересно, есть ли интегрирующее решение (Spring 5, Ehcache 3)

Спасибо.

1 Ответ

0 голосов
/ 01 ноября 2019

Я закончил делать это после того, как был инициализирован контекст Spring. Для каждого элемента в коллекции БД я вызываю getResourceById (), который имеет аннотацию @Cacheable, заполняя таким образом кэш для всей коллекции БД.

Я не рекомендую запускать этот код в @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);
}
}
...