4.8 缓存清空的相关属性设置

对于我们写入的domain、node和value的健值数据,可以匹配一个过期时间,过期后框架会自动进行清空,并且清空也可以设置一个周期,每隔一段时间清空一次过期的数据。在config.xml的Park部分有个EXPIRATION和CLEARPERIOD配置项用来完成该功能:

  1. <EXPIRATION>24</EXPIRATION>
  2. <CLEARPERIOD>0</CLEARPERIOD>

EXPIRATION代表节点的过期时间,单位为小时,默认值是24;

CLEARPERIOD代表清空的周期时间,单位为小时,默认为0(表示不清空)。

如果需要定期清空过期节点数据,可以根据需要设置上面两个配置项,比如为了方便我们接下来演示效果,修改为:

  1. <EXPIRATION>0.02</EXPIRATION>
  2. <CLEARPERIOD>0.01</CLEARPERIOD>

EXPIRATION:0.02×60×60=72秒,表示写入的节点数据在72秒后过期。

CLEARPERIOD:0.01×60×60=36秒,表示每隔36秒清空一次过期数据。

ClearTest是一个main函数类,他获取到ParkLocal后,先创建一个

  1. {domain="china", node="city1", value="beijing"}

的节点,并输出创建时间;然后等待30秒后,再创建2个节点:

  1. {domain="china", node="city2", value="shanghai"}
  2. {domain="china", node="city3", value="shenzhen", heartbeat="true"}

4.8 缓存清空的相关属性设置 - 图1注意

这里创建的三个节点都在相同的domain="china"下,并且"shenzhen"这个节点是一个“心跳”节点,其他2个是普通节点。对于“心跳”节点,我们知道它是跟ParkServer一直保持联系,除非机器故障或者网络中断导致ParkServer删除该节点,否则它不存在随时间过期的概念,因此设置过期自动清空对于“心跳”节点来说是无效的。

在三个节点创建成功后,ClearTest用一个while不断的轮询,获取domain="china"下面所有的节点,并且输出显示,然后停留10秒后又继续。我们运行该demo查看效果:

运行步骤:

1)启动ParkServerDemo(它的IP端口已经在配置文件指定),结果如图4-19所示:

  1. java -cp fourinone.jar; ParkServerDemo

4.8 缓存清空的相关属性设置 - 图2

图4-19 ParkServerDemo

2)启动ClearTest:

  1. java -cp fourinone.jar; ClearTest

4.8 缓存清空的相关属性设置 - 图3

图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源码如下:

  1. // ParkServerDemo
  2. import com.fourinone.BeanContext;
  3. public class ParkServerDemo
  4. {
  5. public static void main(String[] args)
  6. {
  7. BeanContext.startPark();
  8. }
  9. }
  10.  
  11.  
  12. // ClearTest
  13. import com.fourinone.BeanContext;
  14. import com.fourinone.ParkLocal;
  15. import com.fourinone.ObjectBean;
  16. import java.util.Date;
  17. import java.util.List;
  18.  
  19. public class ClearTest
  20. {
  21. public static void main(String[] args)
  22. {
  23. try{
  24. ParkLocal pl = BeanContext.getPark();
  25.  
  26. ObjectBean ob1 = pl.create("china", "city1", "beijing");
  27. System.out.println(new Date()+":");
  28. System.out.println(ob1);
  29.  
  30. Thread.sleep(1000*30);
  31.  
  32. ObjectBean ob2 = pl.create("china", "city2", "shanghai");
  33. System.out.println(new Date()+":");
  34. System.out.println(ob2);
  35.  
  36. ObjectBean ob3 = pl.create("china", "city3", "shenzhen", true);
  37. System.out.println(new Date()+":");
  38. System.out.println(ob3);
  39.  
  40. while(true){
  41. List<ObjectBean> oblist = pl.get("china");
  42. System.out.println(new Date()+":");
  43. System.out.println(oblist);
  44. Thread.sleep(1000*10);
  45. }
  46. }catch(Exception e){
  47. System.out.println(e.toString());
  48. }
  49. }
  50. }