如何使用JAR文件为Amazon S3存储桶(动态IP地址CDN)配置JNLP文件?

Pat*_*ick 5 java jnlp cdn amazon-s3 java-web-start

我有一个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)
Run Code Online (Sandbox Code Playgroud)

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/...
Run Code Online (Sandbox Code Playgroud)

代替:

<jnlp spec="1.0" xmlns:jfx="http://javafx.com" codebase="http://s3.amazonaws.com/...
Run Code Online (Sandbox Code Playgroud)

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

有谁知道这个很好的解决方案?谢谢.

小智 0

基于 s3 主机名的 JNLP 文件版本有时可以工作吗?如果是 - 我预计原因是 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
Run Code Online (Sandbox Code Playgroud)

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

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