zhangkaitao / es

JavaEE项目开发脚手架(我的公众号:kaitao-1234567,我的新书:《亿级流量网站架构核心技术》)
https://github.com/zhangkaitao/es
Apache License 2.0
2.17k stars 1.59k forks source link

请教一个问题, 我有点搞不定了 #17

Closed airene closed 11 years ago

airene commented 11 years ago

ReloadableResourceBundleMessageSource 这个 资源可在运行时加载,我设置了cacheSeconds = 5; 调试用,发现结果不改变,跟进源码 大概实现逻辑是 根据文件时间戳来确定加载不加载。 用myeclipse开发时 每次修改资源文件都会去重新加载文件(inputsteam的ID也是新的),但是出来的结果还是老的结果,麻烦您给看一下。

我看了一个ES的配置文件设置的是1分钟刷新。

相关请看:org.springframework.util.DefaultPropertiesPersister java.util.Properties.loadFromXML()

zhangkaitao commented 11 years ago

用myeclipse开发时 每次修改资源文件都会去重新加载文件(inputsteam的ID也是新的),但是出来的结果还是老的结果,麻烦您给看一下。

这个怀疑是没有同步造成的,即没有把最新的部署到部署环境引起的。

比如我用idea,需要ctrl+alt+F9去同步下

airene commented 11 years ago

我的是自动的, 在myeclipse里刚改完保存, 就去tomcat/webapps/xxx/的classpath里看已经是新的修改结果了, 看了spring的 几个封装的类 最终都指向JDK,貌似没什么特殊的地方,于是, 自己写了一个小例子 用JDK源生的读取properties文件,放在非工作环境(自用的tomcat刚好是reloadable="true")的,发现即使修改了classpath下的*.properties文件,也是看到控制台完成reload之后才变成新的结果。

马上把工作环境的tomcat加上reloadable="true" 后,看到reload之后也能看到新的结果了。

请问这个结论的意思应该是表明: classpath:这个路径 对tomcat来说 全是“资源”,启动就放内存了,虽然spring的ReloadableResourceBundleMessageSource 会根据cacheseconds 的结果,满足超时就用几近源生的方式读资源,但JDK或者tomcat本身还是从内存里取?!

zhangkaitao commented 11 years ago
  <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="cacheSeconds" value="5"/>
        <property name="basename">
            <value>message</value>
        </property>
    </bean>

我刚刚测试了下 没有问题

        System.out.println(messageSource.getMessage("aa", null, null));

        Thread.sleep(10L * 1000);  //在此期间改掉 并发布 你可以单独写个不依赖maven环境的

        System.out.println(messageSource.getMessage("aa", null, null));
airene commented 11 years ago

嗯,上午看到网上有说 JUNIT 没问题,放tomcat里就不行的文章。 回头我再试试吧

谢谢。

niko7g commented 11 years ago

我在tomcat中进行了测试,reloadable=false的。 发现classes中的资源文件,即便是用jdk的Properties的load(class.getResourceAsStream)去读取,也是不会更新的,而用File直接去读取是能更新的。

用spring做国际化时,

classpath:res/MSG 是不会更新的。估计classes下的资源被tomcat缓存了,部分JDK的API受影响。 而 /WEB-INF/classes/res/MSG 时,就能正常热装载了。