我们有一位客户正在使用我们的jnlp来打开一个应用程序。在这个.jnlp中,有30个资源可供下载(例如<jar href="https://url/to/resource.jar" download="lazy"/>
)。我们可以注意到(通过netstat -ano
)在执行jnlp时打开了许多连接。
在我们的应用程序中,我们有一些代码可以下载一些文件,并且在执行过程中,当我们尝试调用BindException: Address already in use
时会抛出异常HttpURLConnection#getInputStream()
。如果我们再次尝试打开jnlp,我们的应用程序甚至都不会被执行,因为抛出了同样的异常(这次是在Java控制台上)。如果我们等待几分钟并检查端口,我们可以看到它们已从netstat -ano
消失,然后我们再次尝试使用jnlp打开,并且错误再次出现在我们的应用程序中。
重要的是,当使用java -jar
调用应用程序时,问题不会发生(因为资源不需要下载并且没有连接打开)。
这个问题只发生在一个客户身上,所以它必须与他们的配置有关。我们尝试添加值为65534和MaxUserPort的TcpTimedWaitDelay但未成功。这个客户没有使用防火墙,也没有使用防病毒软件,但是他们说这个问题一旦迁移到Windows终端服务器就开始出现。他们的Java版本是8u101。
任何可能影响我们的应用程序的想法和解决方法?任何帮助表示赞赏。
代码片段:
public InputStream connect(String urlToConnect) {
URL url = null;
InputStream is = null;
try {
url = new URL(urlToConnect);
HttpsURLConnection httpsConnection = (HttpsURLConnection) url.openConnection();
is = httpsConnection.getInputStream();
} catch (IOException e) {
URLConnector.logger.error("Could not open connection on URL: "+urlToConnect+" -> "+e);
} finally {
if(is != null) {
try { is.close(); } catch(IOException e){}
}
}
return is;
}
答案 0 :(得分:0)
Solved it editing the registry that opens jnlp files: HKCR > JNLPFile > Shell > Open > Command. Instead of ""C:\Program Files\Java\jre${VERSION}\bin\javaws.exe" "%1""
, I used ""C:\Program Files\Java\jre${VERSION}\bin\javaws.exe" -J-Dhttp.keepAlive=false "%1""
More info about Persistent Connections in java can be found here