5

我有一个 Amazon S3 存储桶,用于保存我的 Java 应用程序的 .jar 文件。我有一个 Web 服务器,它动态创建并提供一个 JNLP 文件,该文件指向代码库的这个 Amazon S3 存储桶。

JNLP 似乎能够从我的 Amazon S3 存储桶中正确下载 .jar 文件。但是在尝试启动时,出现以下异常:

ExitException[ 3]java.io.IOException: Cannot find cached resource for URL: http://s3.amazonaws.com/....     
      at sun.plugin2.applet.JNLP2Manager.prepareLaunchFile(Unknown Source)  
      at sun.plugin2.applet.JNLP2Manager.loadJarFiles(Unknown Source)   
      at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)  
      at java.lang.Thread.run(Unknown Source)

Java 是否使用 IP 地址缓存 .jar 文件?在 java 日志的前面,打印了以下内容:“cache: CacheEntry IP mismatch: 207.171.189.80 != 207.171.187.117”。两个 IP 都解析为 S3。

我有点惊讶我遇到了这个问题,并认为这是一个常见问题,但找不到好的解决方案。如果我将 IP 地址粘贴在 JNLP 文件中:

<jnlp spec="1.0" xmlns:jfx="http://javafx.com" codebase="http://207.171.189.80/...

代替:

<jnlp spec="1.0" xmlns:jfx="http://javafx.com" codebase="http://s3.amazonaws.com/...

它每次都有效。否则,它通常会因上述异常而中断。

有谁知道一个好的解决方案?谢谢。

4

1 回答 1

0

您的 JNLP 文件的基于 s3 主机名的版本有时是否有效?如果是 - 我预计原因是 Amazon 的 S3 主机名的生存时间值较短。

现在“A”记录仅在 30 秒后过期。这可能意味着在每个 JAR 文件对 S3 的 HTTP 请求之间,DNS 缓存都会过期。所以下一个 JAR 请求将导致另一个 DNS 查找。

我注意到 S3 的 DNS 只返回一个 IP 地址,但它会在 30 秒后轮换。

% dig s3.amazonaws.com
;; ANSWER SECTION:
s3.amazonaws.com.        229        IN CNAME   s3.a-geo.amazonaws.com.
s3.a-geo.amazonaws.com.  213        IN CNAME   s3-1.amazonaws.com.
s3-1.amazonaws.com.      28         IN A       176.32.100.200

我不确定 JNLP,但通常 Java 对确保 JAR 文件都从同一个“源”加载非常挑剔。在这种情况下,我猜Java希望“源”表示“相同的IP地址”。

最坏的情况,您可以尝试动态生成您的 JNLP,将其实时放入 S3,然后引导您的客户从那里获取完整的捆绑包?

于 2013-11-25T02:18:21.760 回答