我们有一个包含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”创建。相反,我们希望能够在两个服务器之间共享地图的状态。
如何实现?
答案 0 :(得分:1)
为了在WebSphere集群成员之间复制内容,必须设置DynaCache缓存实例以进行复制,并与复制域相关联,并且实际上是在JVM中创建的。定义缓存实例并不等于在JVM中创建缓存实例。调用ic.lookup()时将创建缓存实例。
我的猜测是,当server_1将内容放入缓存实例时,server_2尚未创建缓存实例,因此不会复制内容。我假设您已将共享策略设置为PUSH。
要在服务器启动时强制创建高速缓存实例,请添加定制属性com.ibm.ws.cache.CacheConfig.createCacheAtServerStartup并将其设置为true。您可以将其添加为JVM定制属性(影响所有缓存实例)或缓存实例上的定制属性(仅影响此缓存实例)。