Реализация кэша с использованием infinispan не работает. Как исправить?

#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";
    }
  
  1. В 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);
    }
  
  1. Теперь перейдем к классу 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 активно поддерживает эту интеграцию. Спасибо!