【问题标题】:Having the GUI in a separate process将 GUI 置于单独的进程中
【发布时间】:2011-11-26 13:31:59
【问题描述】:

我目前正在为我创建的 Java 应用程序开发 GUI。我想将 GUI 与客户端的其余部分保持在一个单独的进程中。这背后的基本原理是:

  • 降低了崩溃的风险。例如。 GUI 中的 OutOfMemoryError 不会使客户端的其余部分崩溃。
  • 我“免费”获得了一个 API。如果我以后想要允许其他人以编程方式访问客户端,我可以让他们使用 GUI 使用的相同 API。
  • 我正在用 SWT 编写 GUI,客户端是使用 IntelliJ 创建的。由于 Eclipse 具有更好的 SWT 支持,因此将它们分开是有意义的,这样我就可以将 Eclipse 用于 GUI 代码,而将 IntelliJ 用于其余部分。

我现在的问题是:我应该使用什么技术将客户端界面暴露给 GUI? RMI 是首先想到的。但是,这具有将 API 限制为仅限 Java 的缺点。我也不确定 RMI 是否适合大规模部署(例如,它如何处理本地防火墙?)。不过,我现在还不想排除它。

我还应该提到我也有一些部署要求:

  • 必须能够以非管理员身份运行。
  • 必须能够处理限制性的本地防火墙限制。
  • 部署必须是自动的(它是一个大型消费者应用程序),并且可以在 Windows、Mac OS X 和 Linux 上运行。

鉴于这些限制,您会使用什么解决方案?

【问题讨论】:

  • “我应该使用什么技术来将客户端的界面暴露给 GUI?” 我可能误解了这个问题,但我倾向于简单地将它添加到运行中 - GUI 的时间类路径。直接实例化类并使用它们的方法比使用 RMI 或类似技术要简单得多。我也不太了解 GUI 崩溃并希望保持客户端运行。保持客户端运行有什么意义?
  • 客户端是备份程序。如果 GUI 崩溃,我仍然希望保持备份运行。我还希望能够访问客户端的类实例。 AFAIK,仅通过设置运行时类路径是不可能的。
  • “客户端是一个备份程序。如果GUI崩溃了,我还是想让备份继续运行。” 让备份可以恢复不是更好吗?如果有人绊到 PC 的电源线怎么办?在单独的进程中(在同一台机器上)运行 B/U API 对此无济于事。 ;)
  • 它是可恢复的。但是,我仍然希望尽量减少它崩溃的机会。例如。它可能会在 fsync 中间崩溃并损坏某些文件。仅仅因为它不能提供 100% 的保护并不意味着它一文不值。

标签: java user-interface swt ipc rmi


【解决方案1】:

前段时间我也遇到过同样的情况,只是后端是 Python 的,而 GUI 是 java 的。

需要考虑的要点:

  • GUI 和后端之间的接口需要多么灵活和精细。您希望能够从 GUI 做一件事吗? 5个不同的东西? 10? 50? GUI 的耦合度有多高——它会知道/正在调用后端的各个方法吗?
  • 输出如何从后端到 GUI。它可以简单地写入 STDOUT 或临时文件吗?需要更详细的吗?
  • 输出的格式。理想情况下,它应该易于解析,这表明 XML 或 JSON 可能是您的最佳选择。

您可能会发现JSON-RPC 很有用:它是远程方法调用分离程序的标准。


总而言之,我很难说什么最适合你。我最终避免了 RPC,并为后端提供了一个简单的命令行界面;输出作为 JSON 对象写入临时文件和 STDERR。我觉得这是一个不错的决定,因为它使程序之间的接口非常简单且解耦。

【讨论】:

    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多