从外部Tomcat目录中读取可重载的xml文件
先决条件
- Apache Tomcat 7
- spring3.2.11.RELEASE
- Apache Camel 2.14.1
- 我的Web应用程序像往常一样部署在$ {catalina.home} / webapps /中
要求
- 读取放在war-Archive之外的 xml文件(例如来自$ {catalina.home} / myfolder /)
- xml文件应该是可重新加载的 。 因此,如果xml更改,我的Web应用程序中应该可以使用新的xml文件
- 应将xml文件映射到Java-Objects
第一次尝试
我已经通过tomcat在catalina.home
/conf/catalina.properties中将文件添加到classpath:
common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,${catalina.home}/myfolder/
该文件放在这里:$ {catalina.home} /myfolder/myFile.xml
读取和映射文件到Java-Objects通过apache camel中的计时器工作。
from("timer://myTimer?fixedRate=true&period=20000") .setBody(simple("resource:classpath:myFile.xml")) .unmarshal(myFileJaxbDataFormat) .process(myFileTimerProcessor);
myFileTimerProcessor获取映射的对象并将其存储到Spring-Bean。 其他Camel-Routes使用此Bean来访问xml文件中包含的Data。
问题
正如Claus Ibsen在下面提到的,问题是ClassLoader缓存了文件。 因此,如果文件中的数据已更改,则不会再次读取该文件。 如果文件$ {catalina.home} /myfolder/myFile.xml发生更改,则应再次读取该文件,并且新值应该可供计时器使用,以便它可以读取应用程序的新值。
是否有可能在war-Archive之外读取xml文件并在内容发生变化时重新加载?
是否有更常见的警惕?
提前致谢。
问候,
马克斯
编辑1:我重新调整了问题,不仅要问具体细节。
该文件由Java类加载器缓存,而不是Camel可以做任何事情。 您可能需要使用文件资源而不是classpath加载文件。
- OSGi容器中的Camel:将InterceptStrategy应用于所有驼峰上下文
- 如何以自动方式关闭独立的Apache Camel应用程序?
- 如何通过Apache Camel调用RESTful服务?
- 从Spring注释配置初始化camel
- org.apache.camel.NoTypeConversionAvailableException:没有类型转换器可用于转换类型:
- Camel NotifyBuilder总是返回false
- 在Apache Camel应用程序中,unit testing如何注入模拟端点来代替真实端点?
- 无法通过Camel将日期字段保存为mongo db中的ISO日期?
- Apache Camel – 路由中的事务