4.8 缓存清空的相关属性设置
对于我们写入的domain、node和value的健值数据,可以匹配一个过期时间,过期后框架会自动进行清空,并且清空也可以设置一个周期,每隔一段时间清空一次过期的数据。在config.xml的Park部分有个EXPIRATION和CLEARPERIOD配置项用来完成该功能:
- <EXPIRATION>24</EXPIRATION>
- <CLEARPERIOD>0</CLEARPERIOD>
EXPIRATION代表节点的过期时间,单位为小时,默认值是24;
CLEARPERIOD代表清空的周期时间,单位为小时,默认为0(表示不清空)。
如果需要定期清空过期节点数据,可以根据需要设置上面两个配置项,比如为了方便我们接下来演示效果,修改为:
- <EXPIRATION>0.02</EXPIRATION>
- <CLEARPERIOD>0.01</CLEARPERIOD>
EXPIRATION:0.02×60×60=72秒,表示写入的节点数据在72秒后过期。
CLEARPERIOD:0.01×60×60=36秒,表示每隔36秒清空一次过期数据。
ClearTest是一个main函数类,他获取到ParkLocal后,先创建一个
- {domain="china", node="city1", value="beijing"}
的节点,并输出创建时间;然后等待30秒后,再创建2个节点:
- {domain="china", node="city2", value="shanghai"}
- {domain="china", node="city3", value="shenzhen", heartbeat="true"}
注意
这里创建的三个节点都在相同的domain="china"下,并且"shenzhen"这个节点是一个“心跳”节点,其他2个是普通节点。对于“心跳”节点,我们知道它是跟ParkServer一直保持联系,除非机器故障或者网络中断导致ParkServer删除该节点,否则它不存在随时间过期的概念,因此设置过期自动清空对于“心跳”节点来说是无效的。
在三个节点创建成功后,ClearTest用一个while不断的轮询,获取domain="china"下面所有的节点,并且输出显示,然后停留10秒后又继续。我们运行该demo查看效果:
运行步骤:
1)启动ParkServerDemo(它的IP端口已经在配置文件指定),结果如图4-19所示:
- java -cp fourinone.jar; ParkServerDemo
图4-19 ParkServerDemo
2)启动ClearTest:
- java -cp fourinone.jar; ClearTest
图4-20 ClearTest
出现图4-20,我们可以看到,"Beijing"节点创建成功后,等待了30秒连续创建了"shanghai"和"shenzhen"节点,然后随着图里每隔10秒的时间输出当前domain里的节点状况。
开始有三个节点,"Beijing"节点的创建时间为“15:09:21”,大约在“15:10:41”时,"Beijing"节点被自动清空掉了,因为我们设置的过期时间是72秒,“15:10:41”-“15:09:21”=80秒,已经超过了72秒。这里为什么不刚好等于72秒呢?这是因为节点虽然过期了,但是要等待每次清空周期执行的原因。
同样,再过30秒后,发现"shanghai"节点也过期并清空掉,只剩下"shenzhen"节点一直存在,这是因为"shenzhen"节点是一个“心跳”节点,它没有时间过期的概念而不会被框架自动清空。
读者可以自行调整EXPIRATION和CLEARPERIOD配置,并认真观察随着时间变化节点被清空的状况,细细体会其中的功能机制。
DEMO源码如下:
- // ParkServerDemo
- import com.fourinone.BeanContext;
- public class ParkServerDemo
- {
- public static void main(String[] args)
- {
- BeanContext.startPark();
- }
- }
- // ClearTest
- import com.fourinone.BeanContext;
- import com.fourinone.ParkLocal;
- import com.fourinone.ObjectBean;
- import java.util.Date;
- import java.util.List;
- public class ClearTest
- {
- public static void main(String[] args)
- {
- try{
- ParkLocal pl = BeanContext.getPark();
- ObjectBean ob1 = pl.create("china", "city1", "beijing");
- System.out.println(new Date()+":");
- System.out.println(ob1);
- Thread.sleep(1000*30);
- ObjectBean ob2 = pl.create("china", "city2", "shanghai");
- System.out.println(new Date()+":");
- System.out.println(ob2);
- ObjectBean ob3 = pl.create("china", "city3", "shenzhen", true);
- System.out.println(new Date()+":");
- System.out.println(ob3);
- while(true){
- List<ObjectBean> oblist = pl.get("china");
- System.out.println(new Date()+":");
- System.out.println(oblist);
- Thread.sleep(1000*10);
- }
- }catch(Exception e){
- System.out.println(e.toString());
- }
- }
- }