我们有一个带有 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”创建。相反,我们希望能够在两个服务器之间共享地图的状态。
如何做到这一点?