Стратегия остановки процессов Java в Windows XP - PullRequest
3 голосов
/ 01 октября 2010

Я работаю с приложением, которое состоит из 10 или около того процессов Java, которые взаимодействуют через JINI, JMS, Sockets и базу данных HSQL, работающую в Windows XP.

Кажется, что каждая часть приложения имеетсвой собственный файл .bat.Например, есть:

  • Брокер ActiveMQ
  • Сервер HSQL
  • Службы JINICore
  • Реестр RMI
  • 5 Основные компоненты Java, которыеrun
  • 1 GUI Java

Вот скриншот, чтобы вы могли увидеть безумие, с которым я имею дело:

Ответы [ 6 ]

4 голосов
/ 05 октября 2010

Это похоже на действительно плохой дизайн.Есть несколько вариантов решения этой проблемы:

План A: Соберите все вместе как одно приложение и запустите все в одной JVM - класс запуска может запускать каждый из ваших теперь отдельных процессов как простой поток,Если приложения не делают ничего ужасного, они могут сосуществовать в одной JVM.

План B: Пусть каждая из ваших отдельных JVM создаст ServerSocket и отправит им сообщение через сокет, который они должны закрыть.

План C: Получить ProcessView (http://www.teamcti.com/pview/prcview.htm), можно запустить из командной строки и уничтожить процессы по имени (с подстановочными знаками), чтобы можно было убить все процессы Java за один раз. Это решение с кувалдой,но может удовлетворить ваши краткосрочные потребности.

3 голосов
/ 08 октября 2010

Прочитать справку команды taskkill: taskkill /?

TASKKILL [/S sistema [/U nomeutente [/P [password]]]]
         { [/FI filtro] [/PID idprocesso | /IM nomeimmagine] } [/T] [/F]

Вы можете убивать задачи, зная PID или их имя.

3 голосов
/ 06 октября 2010

Этот ответ представляет собой среднесрочное / долгосрочное решение, но вы должны действительно взглянуть на получение, как выглядит, пользовательских .bat файлов из картинки и использовать Tanuki Java Service Wrapper для получить все ваши долгоживущие процессы Java, установленные как службы Windows с определенным именем. Оттуда достаточно просто создать скрипт .bat, который включает запуск и запуск всех процессов Java, необходимых с помощью команд net start %SERVICE_NAME% и net stop %SERVICE_NAME.

Оболочка Tanuki имеет версию сообщества, которую можно бесплатно использовать для основных функций, включая установку в качестве службы Windows.

3 голосов
/ 01 октября 2010

Это то, для чего созданы серверы приложений.Они сталкиваются с аналогичными проблемами для предоставления всех своих услуг, которые должны быть запущены и отключены в определенном порядке, чтобы поддерживать удовлетворение зависимостей.

Например, вы можете использовать микроядро JBoss, которое не намного больше, чем некоторые загрузчики классов.и двигатель JMX.Вы можете упаковать свои приложения как 'sar' или служебные архивы и указать зависимости в метаданных этих пакетов.

Вы, вероятно, можете делать подобные вещи с урезанной стеклянной рыбой или с помощью сервера Spring DM.

В качестве альтернативы движок OSGi, такой как Equinox или Felix, может предоставлять аналогичные услуги.

Другое преимущество заключается в том, что у вас будет гораздо меньше виртуальных машин.

2 голосов
/ 11 октября 2010

Если с вами не в порядке прекращение сотрудничества, тогда, поскольку это в Windows, возможно, TerminateJobObject - это то, что вы ищете. Завершает все процессы в «задании». Конечно, сначала процессы должны быть связаны с заданием (см. Ссылку MSDN Lib).

Отказ от ответственности: я не использовал его.

Приветствия & hth.,

- Альф

0 голосов
/ 01 октября 2010

Если у вас нет сервера приложений или какого-либо другого фреймворка, как упоминалось ранее, вы можете сделать одну из нескольких вещей. Можете ли вы найти pid-ы этих процессов? Если это так, вы можете попробовать отправить им сигналы (для системы * nix). Если у вас есть контроль над кодом этих Java-процессов, вы можете прослушивать их через сокеты tcp; создайте простое сообщение, которое скажет процессу завершить работу. В основном это ситуация с IPC.

...