先决条件
- Apache Tomcat 7
- Spring 3.2.11.RELEASE
- Apache Camel 2.14.1
- 我的 Web 应用程序像往常一样部署在 ${catalina.home}/webapps/
要求
- 读取放置在war-Archive 之外 的 xml 文件(例如来自 ${catalina.home}/myfolder/)
- xml 文件应该可重载。因此,如果 xml 更改,新的 xml 文件应该在我的 Web 应用程序中可用
- xml 文件应该映射到 Java 对象
先试试
我已经通过 tomcat 在 catalina.home
/conf/catalina.properties 中将文件添加到类路径中:
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.home}/myfolder/
文件放在这里: ${catalina.home}/myfolder/myFile.xml
通过 apache camel 中的计时器读取文件并将其映射到 Java 对象。
from("timer://myTimer?fixedRate=true&period=20000")
.setBody(simple("resource:classpath:myFile.xml"))
.unmarshal(myFileJaxbDataFormat)
.process(myFileTimerProcessor);
myFileTimerProcessor 获取映射的对象并将其存储到 Spring-Bean。 其他 Camel-Routes 使用此 Bean 来访问 xml 文件中包含的数据。
问题
正如 Claus Ibsen 在下面提到的,问题是 ClassLoader 缓存了文件。因此,如果文件中的数据已更改,则不会再次读取该文件。 如果文件 ${catalina.home}/myfolder/myFile.xml 发生更改,则应再次读取该文件,并且新值应可供计时器使用,以便它可以读取应用程序的新值。
是否有可能在 war-Archive 之外读取 xml 文件并在内容更改时重新加载它?
是否有更常见的注意事项?
提前致谢。
问候,
最大
编辑 1: 我重组了问题,不仅询问具体细节。
最佳答案
该文件由 Java 类加载器缓存,Camel 对此无能为力。您可能需要使用文件资源而不是类路径来加载文件。
关于java - 从外部 Tomcat 目录读取可重新加载的 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29829601/