【问题标题】:Avoid server calls for loose resources that do not exist避免服务器调用不存在的松散资源
【发布时间】:2012-11-23 05:46:26
【问题描述】:

我正在开发一个在 Java 1.5(与 1.5+ 兼容)上编译的小程序应用程序。 它包含一些资源属性文件,这些文件捆绑在同一个 jar 中,与 Java 包平行。

每当我通过小程序访问该资源文件时,它都会向下载小程序的服务器发出请求。之后,它从 jar 中读取文件并像以前一样工作,但我不希望它对这些文件发出服务器请求。

这就是我的 java 代码访问资源文件的方式。

ResourceBundle messages = ResourceBundle.getBundle("resources/properties/Messages", locale);

我尝试了两种访问方式:

ResourceBundle messages = ResourceBundle.getBundle("resources.properties.Messages", locale);

两者的行为相同。

注意:这些资源在我的网络应用中不能作为松散资源使用。

【问题讨论】:

  • 我的大多数用户都在使用 Java 1.5 插件。所以我使用objectembed 标签来运行我的小程序。
  • 基于 JNLP 的小程序之前的默认设置是急切地下载所有资源。
  • @AndrewThompson 如果是这样,为什么小程序在运行时会请求资源..
  • 网络日志是否暗示了这一点?是否由诸如Wireshark 之类的数据包嗅探器指示? Java 控制台可能会提供相当误导的信息。
  • @AndrewThompson 我从服务器日志中获得了这些详细信息。当时我正在分析我的服务器日志中的 404 和 500 响应,我遇到了这些在 applet jar 中存在并使用的 /resources/properties/Messages_en_US.properties /resources/properties/Messages_en.properties /resources/properties/Messages.class

标签: java applet http-status-code-404


【解决方案1】:

我从服务器日志中获得了这些详细信息。我正在分析我的服务器日志中的 404 和 500 响应..

可能会出现404(未找到)和500(服务器错误)消息,因为插件正在尝试检查缓存的资源是否是最新的。为此,它需要检查资源服务器版本的最后更新时间。

复杂的因素是资源可能位于小程序的archive 属性中提到的 Jar 中它可能是一个“松散文件” ' 在与指定的 codebase 相同的路径上。因此,如果资源位于 Jar 的以下路径中:

/resources/properties/Messages_en_US.properties 

JVM也会检查

${codebase}/resources/properties/Messages_en_US.properties 

以及每个罐子。

要修复它们,请参阅codebase_lookup 参数。这个用例需要:

<param name='codebase_lookup' value='false' >

这告诉 JVM 有 没有 资源作为松散文件存储在类路径上,并且只有 Jars 将被搜索。它应该停止经常报告404/500 消息(对于理解该参数的较新 JRE)。

【讨论】:

  • 经过测试,我发现它适用于 JRE 1.6+ 并且在低于此值时失败,无论如何这会减轻我的痛苦.. 谢谢
  • 是的,很抱歉,我无法找到它引入的确切版本。您可能会发现它是 1.6.0_10+,其中引入了很多更改。尽管如此,如今大多数 JRE 都配置为自动更新,随着时间的推移,它应该会减少痛苦。 :)
  • 是的,大约 90% 以上的用户正在使用 JRE 1.6+ :D
  • 嗯。少数版本/使用统计数据之一。我曾经听说过。 :)
【解决方案2】:

我不太了解 Java 插件缓存小程序的内部细节,但如果您的小程序使用 .jnlp 描述符,我会尝试将 download="eager" 添加到描述符的 &lt;jar&gt; 元素中。

您也可以尝试将 ResourceBundles 定义为类而不是 .properties 文件。例如:

package resources.properties;

import java.util.ListResourceBundle;

public class Messages
extends ListResourceBundle  {
    protected Object[][] getContents() {
        return new Object[][] {
            {"entry1", "Some message text"},
            {"entry2", "A different message"},
            // etc.
        };
    }
}

就像属性文件一样,您可以为任意数量的语言环境定义它们:

package resources.properties;

import java.util.ListResourceBundle;

public class Messages_es
extends ListResourceBundle  {
    protected Object[][] getContents() {
        return new Object[][] {
            {"entry1", "Some message text in Spanish"},
            {"entry2", "A different message in Spanish"},
            // etc.
        };
    }
}

如果您定义 ResourceBundle 子类,最好删除相应的 .properties 文件。

【讨论】:

  • Java 1.6.10 提供了对小程序的 Jnlp 支持。我的也在 Java 1.5+ 中运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多