科技时代新浪首页 > 科技时代 > 学园 > 正文

把JBoss缓存用作POJO缓存的实战演练(3)


http://www.sina.com.cn 2006年03月02日 10:51 天极yesky

    (四) 代码片断

  下面是代码片段-它实例化一个PropagationManager实例并设置站点和传感器结点之间的正确关系。最后,我们使用TreeCacheAop API putObject()来把POJO(在这种情况中,是PropagationManager实例)放入缓存管理之中。之后,任何POJO操作都将被良好地粒度地复制;例如,一个setState()操作将只复制相应的状态字段(它是一个整数)。

protected void setUp() throws Exception {
 cache1_ = createCache("TestCluster");
 cache2_ = createCache("TestCluster");
 initPm();
}
protected void tearDown() throws Exception {
 cache1_.remove("/");
 cache1_.stop();
 cache2_.stop();
}
private TreeCacheAop createCache(String name) throws
Exception {
 //通过注入来配置缓存
 PropertyConfigurator config = new PropertyConfigurator();
 //读取replSync xml.
 //这里我们使用同步复制模式.
 config.configure(tree, "META-INF/replSync-service.xml");
 //我们可以设置一个不同的簇组.
 tree.setClusterName(name);
 tree.start(); //开始缓存
 return tree;
}
/***填充繁殖树*/
protected void initPm() throws Exception {
 pm_ = new PropagationManagerImpl();
 pm_.setRootNode("Japan");
 pm_.addNode("Japan", "Tokyo"); //东京站
 // Wind传感器设备
 pm_.addNode("Japan.Tokyo", "WindSensor1");
 pm_.addStateItem("Japan.Tokyo.WindSensor1", 1000,"power supply", 1040); //电源供应
 pm_.addStateItem("Japan.Tokyo.WindSensor1", 1001, "sensor unit", 1040); //传感器单位
 //Rain传感器设备
 pm_.addNode("Japan.Tokyo", "RainSensor1");
 pm_.addStateItem("Japan.Tokyo.RainSensor1", 1002,"power supply", 1040); //电源供应
 pm_.addStateItem("Japan.Tokyo.RainSensor1", 1003,"sensor unit", 1040); //传感器单位
 pm_.addNode("Japan", "Yokohama"); // 横滨站
 //Wind传感器设备
 pm_.addNode("Japan.Yokohama", "WindSensor2");
 pm_.addStateItem("Japan.Yokohama.WindSensor2", 1000,"power supply", 1040); //电源供应
 pm_.addStateItem("Japan.Yokohama.WindSensor2", 1001,"sensor unit", 1040); //传感器单位
 // Rain传感器设备
 pm_.addNode("Japan.Yokohama", "RainSensor2");
 pm_.addStateItem("Japan.Yokohama.RainSensor2", 1002,"power supply", 1040); //电源供应
 pm_.addStateItem("Japan.Yokohama.RainSensor2", 1003, "sensor unit", 1040);//传感器单位
 //网络中的Wind传感器的摘要结点
 pm_.createNode("WindSummary", "WindSummary");
 pm_.setUpperNode("WindSummary","Japan.Tokyo.WindSensor1"); //关联
 pm_.setUpperNode("WindSummary","Japan.Yokohama.WindSensor2"); //关联
 //网络中的Rain传感器的摘要结点
 pm_.createNode("RainSummary", "RainSummary");
 pm_.setUpperNode("RainSummary", "Japan.Tokyo.RainSensor1"); //关联
 pm_.setUpperNode("RainSummary","Japan.Yokohama.RainSensor2"); //关联
}
/**主启动点,由main来调用*/
public void testPropagation() throws Exception {
 //在此我们让POJO缓存来管理pm
 cache1_.putObject("/monitor", pm_);
 //输出
 printStatus("Initial state", pm_);
 // 从Manager #2检索POJO
 PropagationManager pm2 = (PropagationManager) cache2_.getObject("monitor");
 System.out.println( "---------------------------------------------");
 System.out.println("Modified on Manager #1");
 //该项中的一个状态被修改.
 //这将是良好粒度的复制
 pm_.stateChange("Japan.Tokyo.RainSensor1", 1003, 1041);
 printStatus("Japan.Tokyo.RainSensor1: id: 1003 state:
1040->1041 (retrieved from Manager #2!)", pm2);
 System.out.println( "---------------------------------------------");
 System.out.println("Modified on Manager #2");
 //该项中的一个状态被修改.
 //这将是良好粒度的复制.
 pm2.stateChange("Japan.Yokohama.WindSensor2",
 1001, 1041); //在缓存#2上修改状态
 printStatus("Japan.Yokohama.WindSensor2: id: 1001 state:
1040->1041 (retrieved from Manager #1!)", pm1);
 System.out.println( "---------------------------------------------");
 System.out.println( "Add a new VibrationSensor on Tokyo station");
 // Vibration传感器设备
 pm_.addNode("Japan.Tokyo", "VibrationSensor1");
 pm_.addStateItem("Japan.Tokyo.VibrationSensor1", 1004,"power supply", 1040); // 电源供应
 pm_.addStateItem("Japan.Tokyo.VibrationSensor1", 1005,"sensor unit", 1040); //传感器单位
 printStatus("Japan.Tokyo.VibrationSensor1: (retrieved from cache #2)", pm2);
}
public static void main(String[] args) throws Exception {
 PropagationReplAopTest pmTest =new PropagationReplAopTest();
 pmTest.setUp();
 pmTest.testPropagation();
 pmTest.tearDown();
}

  在上面的实例片断中,请注意下列几点:

  1.两个缓存实例被通过XML注入配置成功并且在随后启动。它们可以运行在两个独立的JVM中(并且在不同的机器上)。

  2.一个PropagationManager的实例经由一个putObject() API调用被放入到缓存管理中。此后,只需要单纯的POJO操作。例如,我们可以把额外的结点添加到PropagationManager实例上并且它将会相应地进行复制。

  3.经由一个getObject()调用,我们在缓存#2上检索PropagationManager的一个新实例。

  4. 各种setState()调用只会激活到其它的缓存实例的良好粒度的复制。

  (五) 结果输出

  最后,当运行这个实例时,结果的输出如下所示:

Initial state
---------------------------------------------
Japan (Summary : 2000 [ok])
+ Tokyo (Summary : 2000 [ok])
+ + WindSensor1 (Summary : 2000 [ok])
+ + | ( name = power supply, id = 1000, state =1040)
+ + | ( name = sensor unit, id = 1001, state =1040)
+ + RainSensor1 (Summary : 2000 [ok])
+ + | ( name = power supply, id = 1002, state =1040)
+ + | ( name = sensor unit, id = 1003, state =1040)
+ Yokohama (Summary : 2000 [ok])
+ + WindSensor2 (Summary : 2000 [ok])
+ + | ( name = power supply, id = 1000, state =1040)
+ + | ( name = sensor unit, id = 1001, state =1040)
+ + RainSensor2 (Summary : 2000 [ok])
+ + | ( name = power supply, id = 1002, state =1040)
+ + | ( name = sensor unit, id = 1003, state =1040)
---------------------------------------------
Modified on Manager #1
StateItem.setState(): id: 1003 state changed \
from 1040 to 1041
……(篇幅所限省略)

  请注意其中加粗的几行。基本上,我们首先在管理器#1上进行了一个POJO操作setState,然后打印输出propagation(繁殖)树来验证状态被更新了,并且反过来也如此。如此重复是值得的,尽管没有显示在复制层数据流的输出结果中,但是每一个setState()操作也将会只激活具有良好粒度的字段级复制。另外,如果该调用是在一个事务上下文中,那么更新将会被批量地进行;也就是说,只要准备好提交时才进行复制。最后,还要注意,我们已经能够轻松地把一个新的传感器添加到网络中。一个传统型的系统一般都要求某种类型的重启机制。

  四、 总结

  在本文中,我们分析了通过平衡TreeCacheAop组件来实现用JBoss缓存担任POJO缓存的能力。通过使用POJO缓存功能,它能够为POJO提供无缝的持续性存储的能力-在保留对象-图关系的同时又能实现良好粒度的复制。

[上一页] [1] [2] [3]

发表评论

爱问(iAsk.com)



评论】【论坛】【收藏此页】【 】【多种方式看新闻】【下载点点通】【打印】【关闭




科技时代意见反馈留言板 电话:010-82628888-5595   欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996 - 2006 SINA Corporation, All Rights Reserved

新浪公司 版权所有