Запуск приложения Java GUI из другого сервиса java - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть приложение GUI, которое должно работать в фоновом режиме и постоянно собирать информацию. Сначала необходимо отобразить пользовательский интерфейс для ввода учетных данных, а затем время от времени для отображения ошибок.

Я понимаю, что не могу запустить приложение GUI как службу, поэтому я подумал о создании службы только для запуска GUI приложение. Таким образом, первая программа запускается как служба, которая просто запускает приложение GUI, а затем продолжает прослушивать любую информацию из приложения GUI. Ниже приведен код первого приложения, которое запускает приложение GUI.

String path =   Paths.get("D:\\Dempapp.jar").toAbsolutePath().normalize().toString();
 String[] startOptions = new String[] {"javaw", "-jar", path};
    Process p = new ProcessBuilder(startOptions).start();

    Timer tempTimer = new Timer();
    tempTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println((new Date()).toString());
        }
    },new Date(),10*1000);

Когда я запускаю его, приложение GUI запускается, но в какой-то момент замирает на 5-10 секунд, поэтому GUI никогда не запускается. Однако, если я уничтожу первое приложение, которое запустило приложение GUI, GUI сразу же появится, а затем продолжит работать, как и ожидалось. И я еще не запускал первое приложение как службу, я все еще запускаю его из командной строки.

Так есть ли лучший способ запустить это приложение GUI из службы windows

1 Ответ

2 голосов
/ 13 апреля 2020

Когда вы запускаете процесс изнутри процесса, вам нужно обработать системный вывод процесса. Поскольку выходные данные буферизуются, они даже превышают максимум, а затем ваш дочерний процесс останавливается.

 String path = Paths.get("D:\\Dempapp.jar").toAbsolutePath().normalize().toString();
 String[] startOptions = new String[] {"javaw", "-jar", path};
 Process p = new ProcessBuilder(startOptions).start();

  BufferedReader br=new BufferedReader(new InputStreamReader(p.getInputStream()));
  String line;
  while((line=br.readLine())!=null) {
     // DISCARD IT. 
  }

Вы также можете отказаться от него или обращаться с ним иначе.

См. Также здесь: Java ProcessBuilder: результирующий зависание процесса

...