【问题标题】:Tomcat 8.5 takes too long to recognize new contentTomcat 8.5 识别新内容的时间太长
【发布时间】:2017-12-04 18:29:43
【问题描述】:

我有以下问题,我在C:\Tomcat85\webapps\MyWebApp\Excel\myExcel.xls写了一个Excel文件。

一旦我的 Java 应用程序完成了文件的写入,它就会执行下载以供用户使用。这会产生令人讨厌的 404 错误。

如果我等待几秒钟并重新加载它下载的页面(或在 java 中添加五秒钟的睡眠,它的工作原理相同)。

所以,我得出的结论是,Tomcat 需要 5 秒来识别这个新的 excel 文件存在,然后才能够为它提供服务。

有没有办法让 Tomcat 更快地执行这个任务?也许在 web.xml 中使用一些配置来区别对待“/Excel/”文件夹。

Windows 10 64 位、Tomcat 8.5、Java 7(可以尝试 java8,但我认为不会有什么不同)。

一些代码:

new ExcelExport(remoteHandle, context).execute( outFileName, outMessage);
// Thread.sleep(5000);
httpContext.wjLoc = formatLink(outFileName);
  • sleep 被注释或取消注释取决于测试。没有睡眠,我得到 404,在 5 秒内睡眠它工作正常。
  • httpContet.wjLoc 只是执行下载,作为文件的链接。

写入工作正常,因为我在文件资源管理器中看到它已准备好并可写入,但如果我尝试通过 URL 打开它,我会得到相同的 404。

【问题讨论】:

  • 你能发布一些示例代码吗?您的代码中可能存在一些泄漏导致延迟
  • 刚刚添加了一些代码,希望对您有所帮助!感谢您的关注。

标签: java tomcat caching static-content tomcat8.5


【解决方案1】:

Resources 默认缓存。重新验证缓存条目之间的时间量(以毫秒为单位)由cacheTtl 参数定义,在this documentation 中引用。默认值为 5 秒。

如果要禁用缓存,只需将cachingAllowed 设置为false

【讨论】:

  • @FedericoAlvarez Context 元素没有cacheTTLcachingAllowed 参数。 Resources 元素有。 Resources 元素可以嵌套在 Context 组件内。如果您没有 Resources 元素,请添加它。喜欢<Context><Resources cachingAllowed="false" /></Context>
  • 文件下载量大会出问题。在这种情况下,我建议您仅在紧急情况下使用此解决方案。对于长期解决方案,请实施Filter 以按照您想要的方式获取文件。如果不经常访问文件,我不会浪费时间实施过滤器。选择更适合您的情况。在遇到真正的问题之前,我总是更喜欢简单的。
  • 您认为您的文件在每五秒之间会被下载一次以上吗?如果它是像 Excel 文件这样的文档,我不这么认为。我不会花时间在这上面,只要它真的会像您网页中的图像一样被下载。偶尔下载的文件,不需要 Tomcat 上的缓存。并且你可以使用 Apache 或 Ngnx 在 Tomcat 前面放置一个缓存。
  • 我从来没有这样做过,但是您可以扩展 org.apache.catalina.WebResourceRoot 类并将其传递给 Resources 元素的参数 className
  • 我最终在 /META-INF/context.xml 中添加了以下行:''。我仍然需要四处寻找它的缺点。非常感谢 Italo。
猜你喜欢
  • 2018-12-17
  • 2015-07-05
  • 1970-01-01
  • 2021-05-21
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
相关资源
最近更新 更多