У меня есть вариант использования, когда аннотация @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);
}
}
Вы явно включили кэширование с помощью аннотации @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-компонент диспетчера кеша, хотя я использовал весеннюю загрузку, и это работало как шарм. Спасибо за вашу помощь.