使用 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 连接保持活动状态并且界面按最初预期的方式工作。
我正在构建一个使用 Java 自动化接口连接到 Enterprise Architect 的应用程序。当程序退出时,Windows 任务管理器中保留了一个 EA 进程。
应用程序正在使用 windowClosing
挂钩在存储库对象上调用 .CloseFile()
、.Exit()
和 .destroy()
,但 EA 进程仍然存在。添加强制垃圾收集的调用似乎没有什么不同。
加载 EA 文件可能需要相当长的时间。在此期间,用户只能等待......所以应用程序显示 "Please Wait" 屏幕。为了防止 UI 冻结,所有加载都在单独的线程(而不是 SwingWorker)中完成,同时在 Glass Pane 上播放加载动画。
自动化接口使用 COM,当加载程序线程终止时,它会破坏 COM 连接。在线程结束之前收集的所有数据都很好,但所有后续访问都失败了(有点神秘)。由于连接被切断,应用程序无法与 EA 断开连接(因此僵尸)。
我通过在主线程上获取对 EA Repository 对象的引用(一个非常快速的操作)解决了这个问题,但仍然延迟加载到工作线程。由于主线程在应用程序的整个生命周期中都保持活动状态,因此 COM 连接保持活动状态并且界面按最初预期的方式工作。