Я использую изолированный апплет (Java 8u25) на веб-странице, которая пытается подключиться к другому порту на том же сервере.
В более старой Java-версии (до 8) это работало без проблем.
В java 8 такой доступ считается междоменным доступом и, таким образом, пытается загрузить crossdomain.xml на целевой порт.
Но в моем случае этот порт не обрабатывает HTTP (наш собственный протокол двоичных данных) и не отвечает должным образом или вообще не отвечает на запрос.
Теперь кажется, что у апплета нет времени ожидания для этой ситуации, и поэтому запрос остается в вызове CrossDomainXML.check().
Вот стек из дампа потока застрявшего апплета:
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
- locked <0x058c2288> (a java.io.BufferedInputStream)
at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
- locked <0x058c2328> (a sun.net.www.protocol.http.HttpURLConnection)
at sun.net.www.protocol.http.HttpURLConnection.access$200(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$9.run(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$9.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessController.doPrivileged(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
- locked <0x058c2328> (a sun.net.www.protocol.http.HttpURLConnection)
at com.sun.deploy.net.CrossDomainXML.check(Unknown Source)
at com.sun.deploy.net.CrossDomainXML.check(Unknown Source)
at sun.plugin2.applet.SecurityManagerHelper.checkURLPermissionHelper(Unknown Source)
at sun.plugin2.applet.AWTAppletSecurityManager.checkPermission(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.URLtoSocketPermission(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source)
at myCode calling new URL("http://...").openConnection().connect();
Есть ли способ установить время ожидания подключения или как-то другим образом повлиять на проверку crossdomain.xml, чтобы решить эту проблему?
Редактировать: я только что заметил кое-что еще более злое: как только один вызов застревает в этой точке (даже если я уничтожу поток), дальнейшие вызовы не могут быть успешно выполнены в любом потоке. Я считаю, что это связано с тем, что определенная блокировка удерживается и остается заблокированной даже при прерывании или остановке () застрявшего потока. (interrupt(), кажется, вообще не имеет никакого эффекта.)
Кроме того, такая установка глобального тайм-аута соединения не разрешена в изолированном апплете:
System.setProperty("sun.net.client.defaultReadTimeout", "2000");
System.setProperty("sun.net.client.defaultConnectTimeout", "2000");
Но, возможно, стоит попробовать установить их через параметр VM извне.