Можно ли начать процесс Java под Windows Service с C #? - PullRequest
1 голос
/ 21 мая 2010

Я хотел бы обернуть Java-программу в службу Windows с C #, используя System.ServiceProcess.ServiceBase. Поэтому я придумал следующий код:

/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
    System.ServiceProcess.ServiceBase.Run(new JavaLauncher());
}
protected override void OnStart(string[] args)
{
    Thread _thread;
    _thread = new Thread(StartService);
    _thread.Start();
    base.OnStart(args);
}
protected override void OnStop()
{
    Thread _thread;
    _thread = new Thread(StopService);
    _thread.Start();
    base.OnStop();
}
static public void StartService()
{
    System.Diagnostics.Process proc = new System.Diagnostics.Process();
    proc.EnableRaisingEvents = false;
    proc.StartInfo.FileName = "javaw";
    proc.StartInfo.Arguments = config.generateLaunchCommand();
    proc.Start();
}
static public void StopService()
{
    System.Diagnostics.Process proc = new System.Diagnostics.Process();
    proc.EnableRaisingEvents = false;
    proc.StartInfo.FileName = "javaw";
    proc.StartInfo.Arguments = "-jar stop.jar";
    proc.Start();
}

Сначала я должен был использовать Threads в OnStart и OnStop. Если нет, возникает исключение, в котором говорится, что служба прекращена из-за отсутствия действий.

Во-вторых, сервис можно плавно подключить к окнам. Однако служба завершает работу через некоторое время после запуска. Я посмотрел на монитор процесса, только сервисный процесс остается активным в течение этого короткого времени, однако процесс javaw так и не появился. Кто-нибудь знает, как это можно исправить?

Отлично работает в обычной консольной среде. Я думаю, что это как-то связано со службой Windows.

Ответы [ 2 ]

1 голос
/ 21 мая 2010

То, что процесс Java не обнаруживается, не означает, что он не запустился. Это могло начаться и закрыться сразу же. Попробуйте перенаправить stdout / stderr, чтобы увидеть, что происходит.

Также переменная proc в методах StartService и stopservice является локальной переменной. Когда он выходит из области видимости, ваш объект процесса подвергается сборке мусора. Интересно, из-за этого умирает ваш Java-процесс

1 голос
/ 21 мая 2010

Я бы порекомендовал вам использовать решение с открытым исходным кодом.

Смотрите этот пост Как создать службу Windows из Java-приложения
Я бы предложил пойти с этим http://sourceforge.net/projects/yajsw/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...