首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

JDK1.6 ResourceBundle 在tomcat上刷新资源文件

2012-12-28 
JDK1.6 ResourceBundle 在tomcat下刷新资源文件JDK1.6下 ResourceBundle? 本身提供了 ResourceBundle.clea

JDK1.6 ResourceBundle 在tomcat下刷新资源文件

JDK1.6下 ResourceBundle? 本身提供了 ResourceBundle.clearCache(); 方法,在eclipse 下正常测试都是可以正常刷新到修改后资源文件的值,不过当部署到tomcat下后,ResourceBundle.clearCache();这个方法,看起来就不起作用了。

经过一翻调试,终于可以了,贴上代码:

private static ResourceBundle resourceBundle;private static long lastUpdateTime = 0l;private static final Logger LOGGER = Logger.getLogger(ResourceBundleService.class);private ResourceBundleService() {}/** * 载入 ResourceBundle */public static void loadResourceBundle() {try {// 这个是必须的ResourceBundle.clearCache();        //产生ResourceBundle对象时,//重写ResourceBundle.Control 的newBundle方法,//将reload标识位置为trueresourceBundle = ResourceBundle.getBundle("resource", new Locale(GameConfig.locale.substring(0, 2),GameConfig.locale.substring(3, 5)), new ResourceBundle.Control() {public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader,boolean reload) throws IllegalAccessException, InstantiationException, IOException {// 将reload标识位置为truereturn super.newBundle(baseName, locale, format, loader, true);}});lastUpdateTime = System.currentTimeMillis();} catch (MissingResourceException e) {LOGGER.error("There is no " + GameConfig.locale + " resource file found!!");}}/** * 资源文件有改动时才会重新载入 ResourceBundle */public static void reloadResourceBundle() {final String absPath = Thread.currentThread().getContextClassLoader().getResource("").getPath().replaceAll("%20", " ");final StringBuffer resourceFullName = new StringBuffer(512);resourceFullName.append(absPath);resourceFullName.append("resource_");resourceFullName.append(GameConfig.locale);resourceFullName.append(".properties");final File resFile = new File(resourceFullName.toString());if (resFile.exists()) {if (resFile.lastModified() > lastUpdateTime) {System.out.println(("lastUpdateTime==" + lastUpdateTime + " Curr lastModified:" + resFile.lastModified()));ResourceBundleService.loadResourceBundle();}} else {LOGGER.error("resorce file not found :" + resourceFullName.toString());}}

?

主要做了两个事:

1.调用了ResourceBundle.clearCache();

2.产生ResourceBundle对象时, 重写ResourceBundle.Control 的newBundle方法,

 将reload标识位置为true

?

定时检测到资源文件,有改动时重生成ResourceBundle实例,就可以获取到最新的资源文件值。

?

热点排行