Почему Hazelcast не показывает запись на карте при добавлении через CachePut/Cacheable

У меня есть вариант использования, когда аннотация @CachePut добавляет запись в кеш, и мне приходится извлекать ее вручную (через код).

Я вижу, что общее количество резервных копий дает мне 1 как количество записей, но все карты дают мне размер как 0. Итак, я не уверен, что я делаю неправильно.

Вот мой код

HazelcastConfig.java

@Configuration
public class HazelcastConfig {

    @Bean
    public Config hazelcastConf() {
        Config c = new Config()
                .setInstanceName("hazelcast-instance")
                .addMapConfig(
                        new MapConfig()
                                .setName("testmap")
                                .setEvictionConfig(
                                        new EvictionConfig()
                                                .setEvictionPolicy(EvictionPolicy.LRU)
                                                .setMaxSizePolicy(MaxSizePolicy.PER_NODE)
                                                .setSize(1000)
                                )
                                .setTimeToLiveSeconds(500000)
                );
        c.getNetworkConfig().getRestApiConfig().setEnabled(true);
        c.getNetworkConfig().getRestApiConfig().enableGroups(RestEndpointGroup.DATA);
        return c;
    }
}

TestServiceImpl.java

@Service
public class TestServiceImpl implements TestService {

    @Autowired
    @Lazy
    private RestTemplate restTemplate;

    @Override
    @CachePut(value = "testmap", key = "1")
    public String getId() {

        System.out.println("--------------------------");
        System.out.println("-------INSIDE getId-------");
        String id = null;
        CBObject obj = restTemplate.getForObject("http://localhost:3000/testCB", CBObject.class);
        if (null != obj && null != obj.getId()) {
            id = String.valueOf(obj.getId());
        }
        System.out.println("-------- EXIT getId-------");
        System.out.println("--------------------------");
        return id;
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

TestController.java

@RestController
@RequestMapping("/v1")
public class TestController {


    @Autowired
    private TestService testService;

    @GetMapping("/testCB")
    public ResponseEntity<?> doCB() {
        Map<String, String> resp = new HashMap<>();
        String id = testService.getId();
        if (null != id) {
            resp.put("id", id);
        }
        Config config = new HazelcastConfig().hazelcastConf();
        System.out.println(config.getMapConfig("testmap").getTotalBackupCount()); // 1
        HazelcastInstance hz = Hazelcast.getHazelcastInstanceByName(config.getInstanceName());
        System.out.println(hz.getReplicatedMap("testmap").size()); // 0
        System.out.println(hz.getMap("testmap").size()); // 0
        System.out.println(hz.getMultiMap("testmap").size()); // 0

        return ResponseEntity.status(HttpStatus.ACCEPTED).body(resp);
    }
}

LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Как включить TLS в gRPC-клиенте и сервере : 2
Как включить TLS в gRPC-клиенте и сервере : 2
Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.
Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
0
0
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы явно включили кэширование с помощью аннотации @EnableCaching (Ref Doc , Javadoc)?

Кроме того, см. руководство от Spring Boot в Ref Doc по кэшированию, если вы используете Spring Boot.

Кроме того, при использовании Spring Boot вы можете либо добавить переключатель командной строки --debug в команду запуска, либо установить для свойства debug значение true в Spring Boot application.properties, чтобы получить выходные данные из примененной автоматической настройки. В частности, вы захотите увидеть, что класс CacheAutoConfiguration был обработан.

Если вы НЕ используете Spring Boot, то в дополнение к аннотации @EnableCaching вам также нужно будет явно объявить CacheManager bean-компонент, например:

@Bean
HazelcastCacheManager cacheManager(HazelcastInstance hazelcaseInstance) {
  return new HazelcastCacheManager(hazelcastInstance);
}

Для этого потребуется зависимость com.hazelcast:hazelcast-spring JAR от вашего пути к классам среды выполнения.

<dependency>
    <groupId>com.hazelcast</groupId>
    <artifactId>hazelcast-spring</artifactId>
    <version>${hazelcast.version}</version>
    <scope>runtime</scope>
</dependency>

Для примера.

ПРИМЕЧАНИЕ. Не путаете ли вы реализацию HazelcastCacheManager Spring Cache Abstraction CacheManager, которая требует hazelcast-spring JAR и требуется абстракцией Spring Cache с Spring Boot или без него, со стандартным Hazelcast HazelcastCacheManager. Эти 2 класса не одно и то же.

В качестве альтернативы вы также можете использовать Hazelcast в качестве реализации поставщика кэширования JCache в Spring Framework или Spring Boot. Ядро Spring Framework также предлагает поддержку использования JCache. При использовании Spring Boot вам нужно будет указать тип поставщика кеша JCache для Hazelcast (т. е. Embedded или Client/Server). Я оставлю это в качестве упражнения для вас, чтобы понять.

Наконец, я недавно создал пример для собственных целей тестирования, используя Hazelcast в качестве поставщика кэширования в абстракции кэша Spring Framework с использованием Spring Boot, если вы хотите взглянуть.

Надеюсь это поможет!

Ваше здоровье!

Оказывается, мне пришлось добавить bean-компонент диспетчера кеша, хотя я использовал весеннюю загрузку, и это работало как шарм. Спасибо за вашу помощь.

alpheus 21.11.2022 13:37

Другие вопросы по теме