0

我们有一个带有 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 + "\"}]";
    }

我们观察到的行为是对象在“server_1”上实例化,当请求平衡到“server_2”时,该对象不存在,并且该对象的新实例由“server_2”创建。相反,我们希望能够在两个服务器之间共享地图的状态。

如何做到这一点?

4

1 回答 1

1

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

我的猜测是,当 server_1 将内容放入缓存实例时 server_2 尚未创建缓存实例,因此不会复制内容。我假设您已将共享策略设置为 PUSH。

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

于 2019-07-15T15:16:45.450 回答