提问人:Nortia 提问时间:11/16/2023 最后编辑:Nortia 更新时间:11/17/2023 访问量:46
当AvaloniaUI应用程序退出时,如何正确杀死子Java进程?
How to properly kill the child Java process when AvaloniaUI app is exiting?
问:
在我的 AvaloniaUI 应用程序中,我将 Java 应用程序作为进程运行。
private static Process _process;
string command = $"-jar \"{jar}\"";
ProcessStartInfo startInfo = new("java", command)
{
RedirectStandardOutput = true,
RedirectStandardInput = true,
UseShellExecute = false,
CreateNoWindow = true,
};
((IClassicDesktopStyleApplicationLifetime)Application.Current.ApplicationLifetime).Exit += (s, e) =>
{
try { _process?.Kill(); } catch { }
};
_process = new()
{
StartInfo = startInfo
};
_process.OutputDataReceived += OnDataReceived;
_process.Start();
在 MainWindow 的 Closing 事件中,我也有。Process?.Kill();
但是,有时它不起作用,例如,当我的应用程序从任务管理器中终止时。
我该如何解决?我在这里找到了一些解决方案,但它们需要 Windows - 我也需要对 Linux 和 macOS 的支持。
我宁愿不编辑 Java 应用程序代码。
答:
您尝试存档的是运行时不同应用程序之间的一种动态通信。
您有两个应用程序,一个是 c#,另一个是 Java 应用程序。Java 应用程序依赖于 c# 应用程序,在任何情况下,c# 应用程序都会死亡,Java 应用程序也会死亡。
没有解决方案,只有框架。
解决方案 1:
在 Java 应用中实现轮询调度程序,该调度程序每 30 秒对 c# 应用执行一次简单的运行状况检查,例如,如果运行状况检查为阴性,则停止 Java 应用。
解决方案 2:
尝试在 c# 应用程序中创建一个独立线程,该线程在应用程序本身的进程终止后“幸存下来”。此线程应计划每 30 秒对 c# 应用进行一次简单的运行状况检查。
解决方案 3:
创建一个在 c# 应用中启动的脚本,用于执行运行状况检查作业。
解决方案 4:
在基础结构中创建第三个应用程序来执行运行状况检查。
解决方案 5:
使用第三方工具执行此操作。有一些工具可以处理微服务,这是相同的原理。
使用 docker-compose 给出的 Docker 示例:
docker-compose up --abort-on-container-exit
如果只有一个容器停止,这将停止所有正在运行的容器。无需轮询实现。
缺点:仅当您可以以某种方式将其应用于 Java 应用程序是从 c# 应用程序启动这一事实时才有效
评论