Closed airene closed 11 years ago
用myeclipse开发时 每次修改资源文件都会去重新加载文件(inputsteam的ID也是新的),但是出来的结果还是老的结果,麻烦您给看一下。
这个怀疑是没有同步造成的,即没有把最新的部署到部署环境引起的。
比如我用idea,需要ctrl+alt+F9去同步下
我的是自动的, 在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本身还是从内存里取?!
<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));
嗯,上午看到网上有说 JUNIT 没问题,放tomcat里就不行的文章。 回头我再试试吧
谢谢。
我在tomcat中进行了测试,reloadable=false的。 发现classes中的资源文件,即便是用jdk的Properties的load(class.getResourceAsStream)去读取,也是不会更新的,而用File直接去读取是能更新的。
用spring做国际化时,
ReloadableResourceBundleMessageSource 这个 资源可在运行时加载,我设置了cacheSeconds = 5; 调试用,发现结果不改变,跟进源码 大概实现逻辑是 根据文件时间戳来确定加载不加载。 用myeclipse开发时 每次修改资源文件都会去重新加载文件(inputsteam的ID也是新的),但是出来的结果还是老的结果,麻烦您给看一下。
我看了一个ES的配置文件设置的是1分钟刷新。
相关请看:org.springframework.util.DefaultPropertiesPersister java.util.Properties.loadFromXML()