java 当通过CachePut/Cacheable添加条目时,为什么Hazelcast不显示Map中的条目

n9vozmp4  于 2022-11-20  发布在  Java
关注(0)|答案(1)|浏览(139)

我有一个用例,通过@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);
    }
}
mi7gmzs6

mi7gmzs61#

您是否使用@EnableCaching注解(Ref Doc,Javadoc)显式启用了缓存?
另外,如果您使用的是Spring Boot,请参阅缓存参考文档中的Sping Boot 指南。
此外,在使用Sping Boot 时,您可以将命令行开关--debug添加到启动命令中,或者在Spring Boot application.properties 中将debug属性设置为true,以获取已应用的自动配置的输出。特别是,您将希望看到CacheAutoConfiguration类已被处理。
如果您未使用Sping 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缓存抽象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 。
希望这对你有帮助!
干杯!干杯!

相关问题