NutzCN Logo
问答 有关于PropertiesProxy重载项目配置文件的问题
发布于 2020天前 作者 suyun 1821 次浏览 复制 上一个帖子 下一个帖子
标签:

项目本身运行在tomcat里,每次如果修改了某个配置文件,就要重新启动一下项目,耗时还很麻烦,所以就想写个接口,可以在配置文件被修改时,直接调用此接口进行重载所有的配置文件或者某个配置文件。现在就有个问题是,如果修改了原本就被加载的配置项,在使用PropertiesProxy().load(Reader)时,是否会销毁之前旧的配置项,是销毁全部再重新载入,还是只载入有改动的部分?

另外在MultiLineProperties里面,是不是有个注释写错了?

/**
     * <b>载入并销毁之前的记录</b>
     * 
     * @param reader
     * @throws IOException
     */
    public synchronized void load(Reader reader) throws IOException {
        load(reader, false);
    }

    public synchronized void load(Reader reader, boolean clear) throws IOException {
        if (clear)
            this.clear();
        BufferedReader tr = null;
        if (reader instanceof BufferedReader)
            tr = (BufferedReader) reader;
        else
            tr = new BufferedReader(reader);
        String s;
        while (null != (s = tr.readLine())) {
            if (Strings.isBlank(s))
                continue;
            if (s.length() > 0 && s.trim().charAt(0) == '#') // 只要第一个非空白字符是#,就认为是注释
                continue;
            int pos;
            char c = '0';
            for (pos = 0; pos < s.length(); pos++) {
                c = s.charAt(pos);
                if (c == '=' || c == ':')
                    break;
            }
            if (c == '=') {
                String name = s.substring(0, pos);
                String value = s.substring(pos + 1);
                if (value.endsWith("\\") && !value.endsWith("\\\\")) {
                    StringBuilder sb = new StringBuilder(value.substring(0, value.length() - 1));
                    while (null != (s = tr.readLine())) {
                        if (Strings.isBlank(s))
                            break;
                        if (s.endsWith("\\") && !s.endsWith("\\\\")) {
                            sb.append(s.substring(0, s.length() - 1));
                        } else {
                            sb.append(s);
                            break;
                        }
                    }
                    value = sb.toString();
                }
                // 对value里面的\\uXXXX进行转义?
                if (value.contains("\\u")) {
                    value = Strings.unicodeDecode(value);
                }
                value = value.replace("\\:", ":").replace("\\=", "=");
                maps.put(Strings.trim(name), value);
            } else if (c == ':') {
                String name = s.substring(0, pos);
                StringBuffer sb = new StringBuffer();
                sb.append(s.substring(pos + 1));
                String ss;
                while (null != (ss = tr.readLine())) {
                    if (ss.length() > 0 && ss.charAt(0) == '#')
                        break;
                    sb.append("\r\n" + ss);
                }
                maps.put(Strings.trim(name), sb.toString());
                if (null == ss)
                    return;
            } else {
                maps.put(Strings.trim(s), null);
            }
        }
    }
13 回复

load有两种嘛,全删和只覆盖

恩恩,我想问的就是,不clear的时候,重载是只更新被修改的配置项对吧?

我用了PropertiesProxy().setPaths(String)去重载全部配置文件,结果没用。。。怎么回事?

代码

@Override
    public void process(ActionContext ac) throws Throwable {
        log.debug("IKeeperLoginAuth...................");
        PropertiesProxy conf = ac.getIoc().get(PropertiesProxy.class, "conf");
        conf.setPaths("config/custom/");
        String auth_ip = conf.get("auth.ip"), auth_port = conf.get("auth.port"), auth_server = conf.get("auth.server");
        if (Strings.isBlank(auth_ip) || Strings.isBlank(auth_port) || Strings.isBlank(auth_server)) {
            return;
        }
        doNext(ac);
    }

是没有编译过去吧,所以还是老的

setPaths的方法已经走进去了,调试显示也拿到了所有配置文件的路径,但最后出来的还是旧配置

我重启项目再试试

没有用,,,改了配置,再调用setPaths方法,最后拿到的还是原来的

唯有debug咯, 看看拿到的内容是不是新的

配置文件的内容

项目运行的时候,修改配置文件某项的值,然后调用setPaths,调试显示可以拿到路径下所有的配置文件,首先是调用了一个clear,然后再逐个加载,加载的时候被修改的那一项依然是修改前的值,等会我写个test直接使用构造器加载一次试试

测试类里面使用构造器可以拿到新的值,然后我再试了一次,项目里面拿到的还是之前的值。

而且项目里面我也使用构造器试过,也是之前的值

添加回复
请先登陆
回到顶部