使用 EA 的 Java 自动化接口后如何摆脱僵尸进程?

How to get rid of zombie processes after using EA's Java Automation interface?

我正在构建一个使用 Java 自动化接口连接到 Enterprise Architect 的应用程序。当程序退出时,Windows 任务管理器中保留了一个 EA 进程。

应用程序正在使用 windowClosing 挂钩在存储库对象上调用 .CloseFile().Exit().destroy(),但 EA 进程仍然存在。添加强制垃圾收集的调用似乎没有什么不同。

加载 EA 文件可能需要相当长的时间。在此期间,用户只能等待......所以应用程序显示 "Please Wait" 屏幕。为了防止 UI 冻结,所有加载都在单独的线程(而不是 SwingWorker)中完成,同时在 Glass Pane 上播放加载动画。

自动化接口使用 COM,当加载程序线程终止时,它会破坏 COM 连接。在线程结束之前收集的所有数据都很好,但所有后续访问都失败了(有点神秘)。由于连接被切断,应用程序无法与 EA 断开连接(因此僵尸)。

我通过在主线程上获取对 EA Repository 对象的引用(一个非常快速的操作)解决了这个问题,但仍然延迟加载到工作线程。由于主线程在应用程序的整个生命周期中都保持活动状态,因此 COM 连接保持活动状态并且界面按最初预期的方式工作。