Spring boot 如何在WebSphere9集群环境中使用分布式对象缓存

Spring boot 如何在WebSphere9集群环境中使用分布式对象缓存,spring-boot,websphere,distributed,Spring Boot,Websphere,Distributed,我们有一个带2台服务器的WAS9集群。我们的应用程序依赖于维护对象列表。在服务器A上运行的应用程序创建了一个对象,而该对象不在服务器B上的应用程序实例的作用域内。为了复制对象状态,我们尝试在资源->缓存实例->对象缓存实例下启用分布式缓存(作用域为群集,提供程序为默认动态缓存,已启用缓存复制) 服务器之间不共享映射的状态。服务器A上的应用程序将一个对象放置到映射中,并且在服务器B上重新加载和负载平衡后,该对象在映射中不可用。DistributedMap的行为类似于HashMap,根本不会被分发

我们有一个带2台服务器的WAS9集群。我们的应用程序依赖于维护对象列表。在服务器A上运行的应用程序创建了一个对象,而该对象不在服务器B上的应用程序实例的作用域内。为了复制对象状态,我们尝试在资源->缓存实例->对象缓存实例下启用分布式缓存(作用域为群集,提供程序为默认动态缓存,已启用缓存复制)

服务器之间不共享映射的状态。服务器A上的应用程序将一个对象放置到映射中,并且在服务器B上重新加载和负载平衡后,该对象在映射中不可用。DistributedMap的行为类似于HashMap,根本不会被分发

下面是一个简单的代码示例,展示了我们如何尝试使用分布式缓存功能:

@RequestMapping("/test_object_map")
    @Async
    public String testObjectMap(@RequestParam(value="input", defaultValue="") String input) throws InterruptedException, NamingException, UnknownHostException {

        InitialContext ic = new InitialContext();
        DistributedObjectCache wasCashe = (DistributedObjectCache)ic.lookup(DIST_MAP_NAME);

        String testKey = "test_key";
        UseCase object = null;

        if(wasCashe.containsKey(testKey)) {
            object = (UseCase) wasCashe.get(testKey);

        } else {
            object = new UseCase();
            object.setSignature(" UC launched on " + InetAddress.getLocalHost().getHostName());
            wasCashe.put(testKey, object);

        }

        String status = "";

        if(object != null) {
            status = "host: " + InetAddress.getLocalHost().getHostName() + "; object state: " + object.getSignature() ;
        }

        return "[{\"message\": \"" + status + "\"}]";
    }
我们观察到的行为是,对象在“服务器1”上实例化,当请求平衡到“服务器2”上时,该对象不存在,并且该对象的新实例由“服务器2”创建。相反,我们希望能够在两台服务器之间共享映射的状态


如何实现这一点?

为了跨WebSphere群集成员复制内容,必须为复制设置一个DynaCache缓存实例,该实例与复制域关联,并在JVM中实际创建。定义缓存实例并不等同于在JVM中创建缓存实例。缓存实例是在调用了en ic.lookup()

我的猜测是,当服务器_1将内容放入缓存实例时,服务器_2没有创建缓存实例,因此内容不会被复制。我假设您已将共享策略设置为推送

要在服务器启动时强制创建缓存实例,请添加自定义属性com.ibm.ws.cache.CacheConfig.createCacheAtServerStartup并设置为true。您可以将其添加为JVM自定义属性(影响所有缓存实例)或缓存实例上的自定义属性(仅影响此缓存实例)