如何在Hazelcast实例中配置JCache封装的缓存并跨请求验证
验证Hazelcast缓存跨请求可访问性的正确实现
你的核心需求是确保首次请求创建的缓存能在第二次请求中被同一个Hazelcast实例访问到,现有代码的问题在于创建缓存时使用了默认的缓存管理器,没有绑定到你指定的Hazelcast实例,导致缓存和实例不匹配。下面是修正后的完整实现方案:
修正后的代码示例
boolean existCache = false; HazelcastInstance hz = null; // 获取或创建指定名称的Hazelcast实例 hz = Hazelcast.getHazelcastInstanceByName("hzInstanceTest"); if(hz == null) { Config cfg = new Config(); cfg.setInstanceName("hzInstanceTest"); hz = Hazelcast.newHazelcastInstance(cfg); } // 检查目标缓存是否存在于当前Hazelcast实例中 Collection<DistributedObject> distributedObjects = hz.getDistributedObjects(); for (DistributedObject distributedObject : distributedObjects) { if ((distributedObject instanceof ICache) && "hzCacheTest".equalsIgnoreCase(distributedObject.getName())) { System.out.println("找到已存在的缓存:" + distributedObject.getName()); existCache = true; break; } } if (existCache) { // 从当前Hazelcast实例中获取缓存并读取数据 ICache<String, CaLpgDataCollectionDto<CaBigNumber>> icache = hz.getCacheManager().getCache("hzCacheTest"); CaLpgDataCollectionDto<CaBigNumber> hzTestValue = icache.get("hzCacheTest"); System.out.println("读取缓存值:" + hzTestValue); } else { // 关键修正:从当前Hazelcast实例获取绑定的CacheManager,而不是用默认的 CacheManager manager = hz.getCacheManager(); MutableConfiguration<String, CaLpgDataCollectionDto<CaBigNumber>> configuration = new MutableConfiguration<>(); configuration.setExpiryPolicyFactory(AccessedExpiryPolicy.factoryOf(Duration.FIVE_MINUTES)); // 创建缓存并转换为Hazelcast的ICache接口 Cache<String, CaLpgDataCollectionDto<CaBigNumber>> jcCacheTest = manager.createCache("hzCacheTest", configuration); ICache<String, CaLpgDataCollectionDto<CaBigNumber>> hcCache = jcCacheTest.unwrap(ICache.class); // 向当前Hazelcast实例的缓存中存入数据 final ExpiryPolicy customExpiryPolicy = AccessedExpiryPolicy.factoryOf(Duration.FIVE_MINUTES).create(); hcCache.put("hzCacheTest", lpgDatasource, customExpiryPolicy); System.out.println("缓存已创建并存入数据"); }
关键优化点说明
- 绑定缓存管理器到指定实例:不再使用
Caching.getCachingProvider().getCacheManager(),而是调用hz.getCacheManager()获取与当前Hazelcast实例绑定的缓存管理器,确保缓存创建在目标实例中。 - 统一缓存名称:创建和查找缓存时使用一致的名称
hzCacheTest,避免因名称不匹配导致找不到缓存。 - 明确的日志输出:添加了打印日志,方便你在测试时确认缓存的创建和读取状态。
这样修改后,首次请求会在指定的hzInstanceTest实例中创建缓存,第二次请求就能通过同一个实例找到并访问该缓存了。
内容的提问来源于stack exchange,提问作者Hossain
相关产品推荐
相关产品推荐

