2012-02-13 3 views
2

Я пытаюсь создать службу C# для проверки файла журнала для перезапуска приложения Java.Как закончить приложение Java из службы C#

Это приложение Java запускает специальную коммуникационную программу и записывает собранные данные в файл журнала. В настоящее время он запускается с помощью сценария пакетного файла.

Я хочу, чтобы моя служба C# контролировала, обновляется ли файл журнала новыми данными. Если он не получает новые данные, я хочу перезапустить приложение Java.

Я нашел материал в Интернете о вызове пакетных скриптов в приложениях C# и проверке, когда файлы были изменены, но мне было интересно, если они являются способом прекратить выполнение текущей программы Java с использованием приложения C#? Имя Java-программ - javaw.exe, но это другие программы Java, запущенные на этой машине, поэтому они не уникальны. Кто-нибудь знает, как это сделать?

+1

Что вы, возможно, хотите, это PowerShell – McKay

ответ

4

jps -v - это Java-команда, которая детализирует процессы, которые используются java. Если вы делаете этот вызов через C# и передаете информацию в строку, вы можете отсортировать ее и определить, какой именно процесс вы хотите убить.

Вы можете взять на выходе примерно так:

 ProcessStartInfo psi = new ProcessStartInfo("jps", "-v"); 
     psi.RedirectStandardOutput = true; 
     psi.UseShellExecute = false; 
     Process p = new Process(); 
     p.StartInfo = psi; 
     p.Start(); 
     string[] output = p.StandardOutput.ReadToEnd().Split("\n".ToCharArray()); 

После этого, вы можете легко разобрать идентификатор процесса и имя процесса Java вы работаете.

+0

учтите, что предполагается, что на компьютере установлен Java SDK. Если приложение будет запущено на машине, где установлена ​​только JRE, а не SDK, вызов этого процесса не будет работать, поскольку файлы будут отсутствовать. Вы можете включить необходимые файлы SDK в приложение, если планируете развертывание. Но, пожалуйста, обязательно прочитайте EULA для Java, прежде чем делать это, чтобы убедиться, что вы делаете это в своих рекомендациях – Moiz

2

Прекрасная программа для завершения программ изящно, то есть отправлять какой-то сигнал, который вежливо просит программу завершить работу. Если вы используете чистую среду java, я бы рекомендовал вам использовать JMX для этого, но поскольку ваш сторожевой таймер находится на C#, вы можете отправлять сигнал, используя простые TCP-сокеты. Этот способ хорош, если вы можете изменить java-программу, чтобы иметь возможность получать такой сигнал.

kill любой процесс, в котором вы можете использовать команду killtask или C# API, который убивает процесс, идентифицированный PID. Нетрудно найти PID для запуска java-процесса в Windows. Но вы можете использовать команду jps, которая печатает все java-процессы с их основным именем и аргументами класса.

Вы можете пройти специальный идентификатор для вашей Java программы, используя -D вариант: java -Dmyid=1234 MyClass arg1 arg2

Магазин 1234 (MyId) в C# программы. Затем, когда вы хотите проверить, все ли работает java-программа, выполните jps, проанализируйте его вывод, получите процесс с параметром -Dmyid=1234, получите его PID, возвращенный jps, и убейте процесс.

+0

Итак, я могу использовать параметр -DmyId, когда запускаю свою программу, чтобы дать ей уникальный идентификатор? Должен ли я беспокоиться о любых других существующих идентификаторах, если идентификатор, который я выбираю, уже существует? Я думал о попытке переименовать javaw.exe с помощью решения типа launch4j, но если установить идентификатор процесса проще, я бы предпочел его, потому что моя Java-программа имеет достаточно зависимостей, чтобы заставить ее работать [ini-4j и специальная сторонняя связь протокол]. – user1207381

Смежные вопросы