JavaFX桌面应用程序与远程服务器通信的最佳实践

时间:2017-01-12 08:18:49

标签: java javafx desktop-application

我需要有关在JavaFX中与远程服务器通信设计桌面应用程序的最佳实践建议。由于我主要有开发Web应用程序的经验,因此我需要了解常见问题并且需要知道在开发桌面应用程序时应该考虑这些问题。

问题描述和要求:

这是一个员工应用程序,可以根据他们的角色查看数据,获取报告和执行其他几项操作。

  • 此应用程序将安装超过10名员工,#可以稍后增加。
  • 每位员工都应该能够登录并使用该应用程序(多名员工可以同时使用该应用程序)。
  • 将记录对每位员工执行的数据的任何修改,以便将来跟踪。
  • 应用程序将根据其角色以不同方式显示给每个用户。
  • 由于此应用程序将安装在许多计算机上,员工可以从不同的计算机登录到应用程序,并且可以通过登录识别它们。

建议的解决方案:

如果符合以下条件,这被认为是一种好习惯:

  • 我使用Mysql作为后端数据库吗?
  • 我创建了一个与数据库连接的中间服务器 允许客户端应用程序连接到服务器并进行交换 通过它的数据员工使用的每个应用程序实例都应该 直接建立与另一个托管的数据库的连接 服务器在同一个本地网络上?

2 个答案:

答案 0 :(得分:6)

应用程序的体系结构有许多组件需要考虑,并且可以通过多种方式进行设计,因此对该问题没有明确的答案,但在设计时需要考虑一些重要的问题。在开发桌面应用程序时,您应该考虑它与Web应用程序的主要区别,并尝试解决它们带来的挑战。

  • 网络(或Internet)连接:桌面应用程序可能始终没有活动的网络连接,因此除非您需要 当活动连接不可用时,程序使每个事务失败 应该有它的本地嵌入式数据库(如h2),然后同步 活动连接可用时,远程服务器中的Web应用程序的数据(不要连接到远程数据库 直接因为服务器端验证,负载均衡等等!)。

    桌面应用程序本质上是独立的,所以如果不能 没有互联网连接的功能那么它的重点是什么 是一个桌面应用程序?

  • 同步:之前的观点表明您应该拥有本地资源 数据库并与远程服务器应用程序同步。记住这一点 同步应该是两种方式:A)将本地数据发送到服务器 B)从服务器接收数据并将其保存在本地数据库中。这个 如果数据模型复杂且充满依赖性,则可能会非常棘手 因为依赖实体需要同步并且它 增加连接失败或事件等事件中同步操作的风险 电力流失。还应考虑数据模型的变化。所以试着:

    • 将您的数据模型设计为尽可能小。
    • 避免实体之间的依赖关系。
    • 避免在数据模型中对跨用户交互进行建模,因为它打破了应用程序被设计为由用户使用而不管其他用户(在桌面应用程序中经常出现这种情况)的假设。
    • 设计一个考虑数据模型更改的同步协议,可能需要在同步开始之前更新程序。
  • 更新:桌面应用通常需要定期更新。你有 在设计架构的所有步骤中牢记这一点, 特别是在设计高级模块时应该如此 尽可能独立,以便他们可以独立更新。您还需要设计一个更新方案来处理此要求。

  • 多线程: JavaFx和大多数桌面框架(我知道) of)有一个驱动应用程序和UI组件的主线程 得到更新。耗时的操作,如同步和 数据库事务不应该在它们导致的主线程中完成 要冻结的程序。它们应该在一个单独的背景下运行 线程并定期将其进度通知给mian线程。

  • 数据库会话:在网络应用中,在视图中打开会话很受欢迎 数据库会话的策略,但实现它可能是棘手的 用于桌面应用。请记住,通常这不是一个好主意 您不应该保留整个应用程序的单个会话 会议开放很长时间(特别是如果你的话,请记住 以hibernate为例)。

  • 通知:最好实施通知系统,定期检查远程更改并通知用户。

答案 1 :(得分:4)

创建一个我认为完全需要的中间服务器。如果您不确切知道将使用该应用程序的用户数量,如果它突然从10个用户扩展到100,那么它将终止您的数据库。此外,数据库连接对延迟非常敏感,并且交换了许多消息,因此后端服务器与您的数据库“越接近”,它的性能就越好。 (根据MySQL DB的经验直接通过3G网络访问。必须转移到REST以使其可靠地工作)。

据我所知,您已经熟悉Java,我会选择以下架构:

  • 数据库:( MySQL,PGSQL,MSSQL ......)
  • 后端服务器:Spring Boot可能是个不错的选择。

    • JPA(Eclipselink或Hibernate)存储库
    • 在服务级别实施业务逻辑
    • REST接口
    • 处理身份验证和令牌。
  • FrontEnd:JavaFX

    • 与bakend进行HTTP通信。 JavaFX中没有实现业务逻辑。仅与后端接口。

该体系结构将允许在中心位置更新业务逻辑,而无需关心最终用户具有哪个版本的应用程序。此外,我建议版本API(例如:http:/// api / v1 / ...)以避免不兼容。

当然,您可以尝试使用spring-data-rest-webmvc直接通过REST直接公开数据库模型。如果您的数据库已经正确设计,只需点击几次Netbeans就可以获取模型,并准备好应用程序以通过REST公开您的模型;那么,业务逻辑需要在客户端实现。老实说,如果将来需要维护项目,请不要使用此解决方案并在服务器中实现逻辑。

相关问题