无论是项目开发还是分布式软件自动化测试,为了增加系统的灵活性和可配置性,我们常常使用在程序中读取本地配置的方式去控制系统,从而减少系统的停服和部署次数,这个过程是如何实现的呢?

一、方案逻辑
具体实现逻辑详见下图:

二、具体实现
考虑到灵活性,下面代码还可以为 SyncConfig 创建一个构造方法 SyncConfig (String lastModifiedPath),为变量 remoteLastModifiedPath 赋值。

public class SyncConfig {
    private static String remoteLastModifiedPath = "\\\\remoteHost\\SharedFolder\\TestConfig\\lastModified";
    private static long lastModified = 0L;

    public static void syncConfig(String remotePath, String localPath){

        File sharedFile = new File(remotePath);    
        if(! sharedFile.exists() || ! sharedFile.isFile()){
            System.out.println("远端配置文件不存在");
            return;
        }

        lastModified = Long.parseLong(new DataConfig(remoteLastModifiedPath).readProperties("lastModified"));
        if(sharedFile.lastModified() <= lastModified){
            System.out.println("远端配置文件未更新,无需同步");
            return;
        }

        File localBackupFile = new File(localPath + ".bak");
        if(localBackupFile.exists()){
            localBackupFile.delete();
        }

        File localFile = new File(localPath);

        if(localFile.exists()){
            localFile.renameTo(localBackupFile);
            if(CommonUtil.copyFile(remotePath, localPath)){
                System.out.println("本地配置文件更新成功");
                new DataConfig(remoteLastModifiedPath).writeProperties("lastModified", String.valueOf(sharedFile.lastModified()));
            }else{
                localBackupFile.renameTo(new File(localPath));

                if(localFile.exists()){
                    System.out.println("本地配置文件还原成功");
                }else{
                    System.err.println("本地配置文件还原失败");
                }
            }

        }else{
            System.err.println("本地配置文件("+ localPath +")出现异常");
        }
    }
}

三、调用方式
在程序初始化时或者测试初始化时调用同步方法

@BeforeSuite
public void initSuite(){
    String sharedPath = "\\\\remoteHost\\SharedFolder\\TestConfig\\config.properties";
    String localPath = System.getProperty("user.dir") + "/testConfig/config.properties";
    SyncConfig.syncConfig(sharedPath, localPath);
}

四、改进方法
考虑到网络传输速度和配置文件大小的因素,建议调用同步方法的操作在子线程中进行,提升用户体验。

new Thread(new Runnable() {
      @Override
      public void run() {
          // TODO Auto-generated method stub
          SyncConfig.syncConfig(sharedPath, localPath);            
      }
  }).start();

原文链接:http://www.jianshu.com/p/22382e687d96


↙↙↙阅读原文可查看相关链接,并与作者交流