#java #spring-boot #caching #infinispan
#java #весенняя загрузка #кэширование #infinispan
Вопрос:
Я реализую кэш в части моего проекта spring-boot с использованием Infinipsan.
Вот что я сделал:
1. Я добавил @EnableCaching в файл инициализатора загрузки spring в project1.
2. Обновлено application.properties и infinispan.xml соответственно, я создал фиктивный метод weather в project1 для проверки кэширования, и он работал просто отлично.
3. Затем переходим к моей реальной реализации. Первоначально запрос попадает на контроллер project1 здесь
@GetMapping("stream")
public String stream() {
return "stream";
}
- В project1, в stream.jsp, stream.js загружается, который отправляет запрос к контроллеру с url ‘frame’ в другом проекте (назовем его project2) (импортирован в project1 в его pom.xml ) с определенными данными:
@Inject
@Named("faceRecognition")
private FaceRecognition faceRecognition;
@RequestMapping("/frame")
public Object recognize(@RequestBody Map<String, Object> payload) {
return faceRecognition.recognizeFace(payload);
}
- Теперь перейдем к классу FaceRecognition, вот он:
@Named("faceRecognition")
public class FaceRecognition {
//implementing the method
@Cacheable(value="testCache", id="#empIdArr")
public ResponseVO elasticSearchDataRet(String empIdArr) {
ResponseVO responseVO = new ResponseVO();
responseVO.setIndex(empIdArr);
responseVO.setType("None");
responseVO.setStatus("Success");
System.out.println("Not cached yet");
return responseVO;
}
public String recognizeFace(Map<String, Object> payload) {
...After doing few things...
//calling the method. Here empIdArr = [2000]
elasticSearchDataRet(empIdArr[0]);
...Do some stuff....
}
}
Результат: При проверке localhost: 3000 / metrics ‘cache.testCache.size’ (testCache — это имя моего кэша) равен 0, и он выводит «Еще не кэширован» каждый раз, когда выполняется запрос, т. е. кэширование не работает.
Что не так с кодом?
Редактировать: Когда я меняю класс распознавания лиц на, как показано ниже (изменяя позицию @Cacheable), в localhost: 3000 / metrics ‘cache.testCache.size’ начинает увеличиваться, хотя он по-прежнему выводит «Еще не кэширован» каждый раз, когда выполняется запрос:
@Named("faceRecognition")
@Cacheable(value="testCache", id="#empIdArr")
public class FaceRecognition {
//implementing the method
public ResponseVO elasticSearchDataRet(String empIdArr) {
ResponseVO responseVO = new ResponseVO();
responseVO.setIndex(empIdArr);
responseVO.setType("None");
responseVO.setStatus("Success");
System.out.println("Not cached yet");
return responseVO;
}
public String recognizeFace(Map<String, Object> payload) {
...After doing few things...
//calling the method. Here empIdArr = [2000]
elasticSearchDataRet(empIdArr[0]);
...Do some stuff....
}
}
Комментарии:
1. Вы случайно не используете режим недействительности?
2. Нет, я не использую режим недействительности в своем проекте.
3. Какую версию spring-boot вы используете? Вы используете реализацию spring или spring-boot starter? github.com/infinispan/infinispan-spring-boot
4. Я не использую Infinispan Spring Boot Starter в проекте. Это версия 1.5.4 spring-boot. Я добавил дополнительную информацию в вопрос. Пожалуйста, посмотрите на это.
5. Не могли бы вы попробовать поместить
@CacheConfig(cacheNames ="testCache" )
на уровне класса и поместить@Cacheable
в метод, пожалуйста? Я бы также рекомендовал использовать infinispan-spring-boot starter (поддерживаются версии 1.5.x и 2.1.x). Интеграция предлагает гораздо больше возможностей, и команда infinispan активно поддерживает эту интеграцию. Спасибо!