Начиная с Java 17.0.12 и 21.0.4 Java завершается сбоем из-за исключения Headless при запуске приложения с полным графическим интерфейсом через RDP, и сеанс RDP отключается. Удаленный рабочий стол запущен, и к нему можно повторно подключиться. Все приложения, отличные от Java, по-прежнему работают и прекрасно обновляют свой пользовательский интерфейс. Сбой происходит только в приложениях Java с графическим интерфейсом пользователя.Если программа Java пытается выполнить операции с графическим интерфейсом, например создать модальный индикатор выполнения, в то время как сеанс RDP отключен, выдается исключение Headless, хотя среда не обезглавлена, она просто отключена.
Похоже, это связано с https://bugs.openjdk.org/browse/JDK-8340992 и https://bugs.openjdk.org/browse/JDK-8336862, но обходных путей не предусмотрено.
Есть ли обходной путь, который можно реализовать во время выполнения?
Единственные обходные пути, которые мы можем придумать:
Переписать все на другом языке. Это немалая задача.
Понизьте все экземпляры Java/JDK до версии 21.0.3 и не применяйте никаких обновлений безопасности.
Прекратите всю работу и начните заново за любые отключения RDP, вызванные намеренным отключением пользователя, проблемами с Интернетом и т. д. Это то, где мы сейчас находимся, и это вызывает проблемы в работе.
Это может привести к отключению RDP.
также, похоже, является нарушением «контракта», где незначительный момент выпуски не должны вызывать критические изменения.
В основном мы используем простые приложения, состоящие из JFrames, JTextComponents и ProgressMonitor с парой самостоятельных -размещенные приложения JediTerm.
Код, демонстрирующий проблему. ДОЛЖЕН ЗАПУСКАТЬ В СЕССИИ RDP:
import javax.swing.*;
import java.awt.*;
//TIP To Run[/b] code, press or
// click the icon in the gutter.
public class Main {
public static void main(String[] args) throws InterruptedException {
var delay = 10;
var isHeadless = GraphicsEnvironment.isHeadless();
System.out.printf("1) Is headless: %s.%n", isHeadless);
System.out.printf("Sleeping %,d seconds.%n", delay);
System.out.printf("""
DISCONNECT YOUR REMOTE DESKTOP CONNECTION NOW!
RECONNECT AFTER %,d SECONDS.
""", delay);
Thread.sleep(delay * 1_000);
System.out.println("Drawing progress bar");
ProgressMonitor p = new ProgressMonitor(null, "Test progressbar", "My note", 0, 100);
for (int i = 0; i < 100; i++) {
p.setProgress(i);
Thread.sleep(250);
}
isHeadless = GraphicsEnvironment.isHeadless();
System.out.printf("2) Is headless: %s.%n", isHeadless);
//TIP Press with your caret at the highlighted text
// to see how IntelliJ IDEA suggests fixing it.
System.out.printf("Hello and welcome!");
for (int i = 1; i
Подробнее здесь: [url]https://stackoverflow.com/questions/79265762/java-windows-rdp-disconnect-causes-java-headless-exception[/url]
Начиная с Java 17.0.12 и 21.0.4 Java завершается сбоем из-за исключения Headless при запуске приложения с полным графическим интерфейсом через RDP, и сеанс RDP отключается. Удаленный рабочий стол запущен, и к нему можно повторно подключиться. Все приложения, отличные от Java, по-прежнему работают и прекрасно обновляют свой пользовательский интерфейс. Сбой происходит только в приложениях Java с графическим интерфейсом пользователя.[b]Если программа Java пытается выполнить операции с графическим интерфейсом, например создать модальный индикатор выполнения, в то время как сеанс RDP отключен, выдается исключение Headless, хотя [b]среда не обезглавлена[/b], она просто отключена. Похоже, это связано с https://bugs.openjdk.org/browse/JDK-8340992 и https://bugs.openjdk.org/browse/JDK-8336862, но обходных путей не предусмотрено. Есть ли обходной путь, который можно реализовать во время выполнения? Единственные обходные пути, которые мы можем придумать: [list] [*]Переписать все на другом языке. Это немалая задача. [*]Понизьте все экземпляры Java/JDK до версии 21.0.3 и не применяйте никаких обновлений безопасности. [*]Прекратите всю работу и начните заново за любые отключения RDP, вызванные намеренным отключением пользователя, проблемами с Интернетом и т. д. Это то, где мы сейчас находимся, и это вызывает проблемы в работе. [/list] Это может привести к отключению RDP.
также, похоже, является нарушением «контракта», где незначительный момент выпуски не должны вызывать критические изменения. В основном мы используем простые приложения, состоящие из JFrames, JTextComponents и ProgressMonitor с парой самостоятельных -размещенные приложения JediTerm. Код, демонстрирующий проблему. ДОЛЖЕН ЗАПУСКАТЬ В СЕССИИ RDP: [code]import javax.swing.*; import java.awt.*;
//TIP To Run[/b] code, press or // click the icon in the gutter. public class Main { public static void main(String[] args) throws InterruptedException { var delay = 10; var isHeadless = GraphicsEnvironment.isHeadless(); System.out.printf("1) Is headless: %s.%n", isHeadless); System.out.printf("Sleeping %,d seconds.%n", delay); System.out.printf(""" DISCONNECT YOUR REMOTE DESKTOP CONNECTION NOW! RECONNECT AFTER %,d SECONDS. """, delay); Thread.sleep(delay * 1_000); System.out.println("Drawing progress bar"); ProgressMonitor p = new ProgressMonitor(null, "Test progressbar", "My note", 0, 100); for (int i = 0; i < 100; i++) { p.setProgress(i); Thread.sleep(250); } isHeadless = GraphicsEnvironment.isHeadless(); System.out.printf("2) Is headless: %s.%n", isHeadless);
//TIP Press with your caret at the highlighted text // to see how IntelliJ IDEA suggests fixing it. System.out.printf("Hello and welcome!");