Я работаю над проектом, целью которого является публикация данных в Microsoft Azure.На данный момент издатель opc публикует данные, даже когда сервер opc ua отключен.Он просто публикует последнее известное значение.Это не то, что мы хотим.Также частью проекта является автоматическое обнаружение новых серверов opc ua в сети.Чтобы достичь этого, я написал Java-программу, которая запускает экземпляр издателя opc, если обнаружен новый сервер opc ua.Сначала мне нужно было обновить только опубликованныйnodes.json одного издателя, но, похоже, это работает ненадежно.
OPC Publisher - это приложение .NET, которое может быть построено как dll в visual studio 2017.
Проблема в том, что мой инструмент должен убить процесс издателя, если сервер opc ua отключается.Это действительно убивает процесс Java, но издатель opc просто не остановится.
Я попытался запустить издатель через processbuilder и уничтожить процесс с помощью p.destroy (), который не дал никакого результата.Я также пытался убить задачу, используя pid банки, которую я создал для размещения издателя.
Вот так я запускаю opc publisher:
ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "cd \"publisher\" && " + publisherString);
pb.redirectErrorStream(true);
Process p = pb.start();
(publisherString isчто-то вроде «опции dotnet opcpublisher.dll»)
Это работает очень хорошо.
Первая попытка уничтожить процесс была p.destroy();
..., которая вообще не работает.
Вторая попытка состоит в том, чтобы основная программа вызывала вторичный jar, который запускает издателя:
ProcessBuilder publisher = new ProcessBuilder("cmd", "/c", "start", "java", "-jar", "StartPublisher.jar", options);
publisher.redirectErrorStream(true);
Process p = publisher.start();
Затем я получаю pid этого jar через JNA int pid = Kernel32.INSTANCE.GetCurrentProcessId();
и позже убиваю его, используя taskkill каквторой процесс:
ProcessBuilder terminator = new ProcessBuilder("cmd.exe", "/c", "taskkill /PID " + pid + " /T /F");
terminator.redirectErrorStream(true);
Process t = terminator.start();
Это убивает окно cmd и процесс java, но, как уже упоминалось выше, оно не убивает процесс dotnet.
У меня все вышлоидей как решить эту проблему.Это вообще возможно?Или мне нужны дополнительные библиотеки?Я был бы очень рад, если бы кто-нибудь мог мне помочь.