我有一个用例,通过@CachePut注解该高速缓存添加一个条目,我必须手动检索它(通过代码)。
我可以看到,总备份计数给我的条目数为1,但所有Map给我的大小为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);
}
}
1条答案
按热度按时间mi7gmzs61#
您是否使用
@EnableCaching
注解(Ref Doc,Javadoc)显式启用了缓存?另外,如果您使用的是Spring Boot,请参阅缓存参考文档中的Sping Boot 指南。
此外,在使用Sping Boot 时,您可以将命令行开关
--debug
添加到启动命令中,或者在Spring Boot application.properties 中将debug
属性设置为true
,以获取已应用的自动配置的输出。特别是,您将希望看到CacheAutoConfiguration
类已被处理。如果您未使用Sping Boot ,则除了
@EnableCaching
注解之外,您还需要明确宣告CacheManager
Bean,例如:这将需要运行时类路径上的
com.hazelcast:hazelcast-spring
JAR依赖项。比如说。
注意:您是否将
HazelcastCacheManager
Spring缓存抽象CacheManager
实现(它需要hazelcast-spring
JAR,并且是Spring的缓存抽象(无论是否使用Sping Boot )所需的)与Hazelcast的标准HazelcastCacheManager
混淆了。这两个类不是一回事。或者,您也可以在Spring Framework或Sping Boot 中使用Hazelcast作为JCache缓存提供程序实现。核心Spring Framework也为使用JCache提供了support。在使用Spring Boot时,您需要为Hazelcast指定JCache缓存提供程序类型(即嵌入式或客户端/服务器)。我将把它作为练习留给您去理解。
最后,如果您愿意看一下的话,我最近构建了一个example用于我自己的测试目的,使用Hazelcast作为Spring Framework的Cache Abstraction中的缓存提供程序,使用Sping Boot 。
希望这对你有帮助!
干杯!干杯!