首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Thread.currentThread().contextClassLoader.getResource(path)似乎缓存结果。可预防的?

Thread.currentThread().contextClassLoader.getResource(path)似乎缓存结果。可预防的?
EN

Stack Overflow用户
提问于 2012-08-14 22:49:39
回答 4查看 2.5K关注 0票数 2

我有一个Grails2.1应用程序正在开发中,我有一个服务调用Thread.currentThread().contextClassLoader.getResource(fileName)grails-app/conf中加载一个配置文件(不过,我希望位置不重要)。

它工作得很好,,只是我必须重新启动grails应用程序才能将更改加载到配置文件中。我真的很想每次请求资源时都能读取文件内容,至少在开发期间是这样的。

此外,如果我能够避免编写自己的缓存系统,我也想避免它。解决方案越简单越好。

我的问题似乎与这个有速度的相似,但使用getClass().getClassLoader().getResource(path).openStream()似乎不起作用。

编辑:我想我可能遗漏了一个重要的细节。我正在检索的资源是非静态的。我使用grails模板引擎将值注入到资源中,如下所示:

代码语言:javascript
复制
Map bindings = [keys: 'values']
new SimpleTemplateEngine().createTemplate(resource).make(bindings).toString()

使用我的调试器,我发现资源文本没有变化,但是了解上面的内容可能会改变潜在的答案。

编辑2:我尝试像这样使用URLConnection.setUseCaches(false),但没有结果:

代码语言:javascript
复制
URLConnection connection = Thread.currentThread().contextClassLoader.getResource(path).openConnection()
connection.setUseCaches(false)
connection.connect()
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))
String content = reader.readLines().join('\n')
reader.close()
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-15 04:43:12

如果您以这种方式使用资源,您可能会考虑将其从grails/conf移到/web-app中。

在运行grails run-app时,爆炸war的缓存版本实际上是在容器中运行,外部神奇地监视各种更改路径,并重新编译和复制更新的文件,类似于手动热交换.class文件和其他资源。

对于/web-app中的所有文件,这种监视都是开箱即用的。一旦文件在那里,您就可以使用ServletContext获取该文件的句柄。例如,您可能会执行如下操作:

代码语言:javascript
复制
def templateFile = new File(ServletContextHolder.servletContext.getRealPath('/templates/fileName.gsp')).text

把它传递给你的模板引擎。对于锁定文件系统的环境(例如Heroku),getRealPath方法可能无法工作。或者,您也可以使用如下内容:

代码语言:javascript
复制
import org.apache.commons.io.IOUtils
def template =  IOUtils.toString(ServletContextHolder.servletContext.getResourceAsStream('/templates/fileName.gsp'), "UTF-8")

这种做法的缺点是:

  • 您将需要访问ServletContext,这将要求您装载一个容器。因此,在这段代码上没有单元测试;相反,您需要一个集成测试。
  • 将这样的资源放在/web应用程序中将使其公开。或者,如果隐私问题,您可以将它们放在/WEB-app/WEB中。

希望这能有所帮助!

票数 3
EN

Stack Overflow用户

发布于 2012-08-14 23:03:15

你能用Spring的ResourceUtils来做这个吗?http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/util/ResourceUtils.html

它看起来有点像ResourceUtils.getFile("classpath:path/to/file.xyz")

票数 1
EN

Stack Overflow用户

发布于 2012-08-15 00:28:04

getClass().getClassLoader().getResource(path)返回一个URL对象,因此缓存很可能由URL/URLConnection执行。

尝试在应用程序启动时使用URLConnection.setDefaultUseCaches(false) (出于性能原因,可能只在dev环境中使用)。这也可以用setUseCaches()方法在每个URLConnection的基础上设置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11961926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档