Как запустить одну программу из другой программы

У меня есть два проекта, проект1 и проект2.

Вариант 1: Project1 и Project2 находятся на одном компьютере. Если проект Project2 аварийно завершает работу или завершается, Project1 должен перезапустить проект Project2.

Вариант 2: Project1 и Project2 находятся на разных компьютерах. Если проект Project2 аварийно завершает работу или завершается, Project1 должен перезапустить проект Project2.

Это java-проект.

Как я должен выполнить вышеупомянутую задачу?

ИЗМЕНИТЬ:

Я думал о следующих решениях:

  1. Если проекты находятся на одном компьютере, я могу сохранить Project2 в пути к классам Project1 и перезапустить проект2 из проекта1. Но существует проблема. Тогда эти две сущности станут одной программой.
  2. Если эти проекты находятся на разных компьютерах, у меня может быть какая-то третья программа, работающая вместе с project2, которая, как я предполагаю, никогда не выйдет из строя. И эта третья программа могла бы оживить проект2.

Не уверен, насчет моего решения. Требуется ваш вклад.


person John Rambo    schedule 02.12.2015    source источник
comment
Ну не могу я ничего придумать. Но отредактирую вопрос.   -  person John Rambo    schedule 02.12.2015
comment
Возможный дубликат Выполнение другого приложения из Java   -  person Fab    schedule 02.12.2015
comment
Ну, это не дубликат. Пожалуйста, смотрите случай 2.   -  person John Rambo    schedule 02.12.2015


Ответы (2)


Мы используем RabbitMQ: Project1 отправляет запросы о задаче, используя RabbitMQ, а Project2 отправляет уведомления о своей работе, отменяющей RabbitMQ. Если Project2 не отправлял уведомление в течение некоторого времени (например, в течение 30 секунд), Project1 запускает новый экземпляр Project2, просто используя команду ОС, или отправляет запросы Project3, которые на какой-то машине, такой как Project1, и используют только для запуска экземпляров Project1 с помощью команды ОС.

Конечно, вы можете использовать любые брокеры сообщений, не только RabbitMQ.

Но существует проблема. Тогда эти две сущности станут одной программой.

Нет, лучше запустить весь проект как отдельные программы, если Project2 имеет ошибку Out Of Memory или что-то в этом роде, Project1 также умер. Совсем не проблема запустить Java-приложение с помощью ProcessBuilder или чего-то подобного.

person Slava Vedenin    schedule 02.12.2015
comment
Спасибо!! Но это назначение распределенной системы, и мы предполагаем использовать распределенные алгоритмы, поэтому я не уверен, смогу ли я использовать для этого RabbitMQ. - person John Rambo; 02.12.2015
comment
Вы можете использовать любой JMS-запрос или только удаленные или локальные файлы для сохранения тепла Project1. Или Project1 может предоставить небольшой веб-сервис, который просто возвращает все в порядке! Я работаю! - person Slava Vedenin; 02.12.2015
comment
Да, я использую технику сердцебиения/пинга для обнаружения сбоев. Тем не менее, я застрял в части восстановления. - person John Rambo; 02.12.2015
comment
Часть восстановления — самая простая часть, просто запустите приложение Project2 с помощью команды Os (конечно, если Project1 и Project2 будут запускаться на разных машинах, вам нужен Project3, который просто запускает Project2 на одних и тех же машинах. - person Slava Vedenin; 02.12.2015
comment
Хорошо спасибо!! Еще один вопрос, мне нужно использовать сборщик процессов, который будет использовать команду os для восстановления проекта2, верно? - person John Rambo; 02.12.2015
comment
Правильно, просто вызовите run.sh , run.bat или java -jar ... вашего Java-приложения с помощью ProcessBuilder - person Slava Vedenin; 02.12.2015
comment
Спасибо за ваше время!! - person John Rambo; 02.12.2015

Случай 1: одно приложение может запускать другое: ProcessBuilder

Выполнение другого приложения из Java

Случай 2: квази-невозможный, как было задано. Вам нужно что-то работающее на машине проекта 2.

person guillaume girod-vitouchkina    schedule 02.12.2015