在我的 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 的关闭事件中我也有
Process?.Kill();
。
但是,有时它不起作用,例如当我的应用程序从任务管理器中被终止时。
我该如何修复它?我在这里找到了一些解决方案,但它们需要 Windows - 我也需要对 Linux 和 macOS 的支持。
我不想编辑 Java 应用程序代码。
您用来归档的是运行时不同应用程序之间的一种动态通信。
您有两个应用程序,一个使用 C#,另一个使用 Java。 Java 应用程序依赖于 c# 应用程序,并且在任何情况下 c# 应用程序死亡,Java 应用程序也将死亡。
没有解决方案,只有框架自带。
解决方案1:
在 Java 应用程序中实现轮询调度程序,该程序每 30 秒对 C# 应用程序执行一次简单的运行状况检查,例如如果健康检查结果是否定的,请停止 Java 应用程序。
解决方案2:
尝试在 C# 应用程序中创建一个独立线程,该线程在应用程序本身的进程终止后“幸存”。该线程应安排每 30 秒对 c# 应用程序进行一次简单的运行状况检查。
解决方案3:
在您的基础设施中创建第三个应用程序来执行运行状况检查。
解决方案4:
使用第三方工具来执行此操作。有一些工具可以处理微服务,原理相同。