Java 如何在三层web服务后端桌面应用程序中实现异步通知?

Java 如何在三层web服务后端桌面应用程序中实现异步通知?,java,web-services,notifications,desktop-application,Java,Web Services,Notifications,Desktop Application,我们有一个ERP应用程序。服务器端实现为一系列使用Hessian和Spring公开的Web服务。Web服务将DAO层用于所有数据库操作。DAO是使用Hibernate实现的。客户端是JavaSwing。它将Web服务用于所有与数据相关的操作 问题是,如果有另一个客户端同时编辑同一行,则需要阻止某些行被编辑。此外,每当客户机编辑一行时,所有其他客户机都应使用更新的值更新该行。解决方案必须考虑到客户端可能显示相同的数据,但视图不同(例如,在一个客户端中过滤相同的数据,在另一个客户端中不过滤相同的数据

我们有一个ERP应用程序。服务器端实现为一系列使用Hessian和Spring公开的Web服务。Web服务将DAO层用于所有数据库操作。DAO是使用Hibernate实现的。客户端是JavaSwing。它将Web服务用于所有与数据相关的操作

问题是,如果有另一个客户端同时编辑同一行,则需要阻止某些行被编辑。此外,每当客户机编辑一行时,所有其他客户机都应使用更新的值更新该行。解决方案必须考虑到客户端可能显示相同的数据,但视图不同(例如,在一个客户端中过滤相同的数据,在另一个客户端中不过滤相同的数据)

客户端之间的套接字连接是不可能的,因为应用程序需要通过防火墙工作,而不需要额外的配置。持续轮询服务器以获取更新的功能无法很好地扩展,因为我们正在研究数百个并发客户端

看看我的选择,我考虑了JMS,但在花了2天时间尝试用Spring配置ActiveMQ后,我最终放弃了(我以前没有JMS方面的经验,团队也没有)。然而,对于我们这里需要的东西来说,它似乎太复杂了。最后,我使用优秀的websockets实现了一些东西,在客户端上破解了一个新的表侦听器、单元格编辑器和表模型之后,它开始工作了

但我仍然担心客户端负责跟踪可编辑/不可编辑的单元格、添加和删除的行等。从我的角度来看,这个解决方案太脆弱了。在任何给定的时间内,消息都可能丢失,并且所有客户端都会在其状态之间失去同步


我的问题是,考虑到当前的体系结构,您将如何实现这个需求?如果更改后端是一个选项,您会更改什么以使此需求更易于实现?在我看来,Web服务体系结构的无状态性质,加上我们正在使用Hibernate,而且据我所知,当请求修改可能分离的对象时,无法收到通知,这使得事情变得比实际情况更复杂

由于所提到的web服务的无状态性质,除了维护和定期查询/更新特定记录的锁状态(锁所有者、锁类型、timestammp等),什么都没有了。不要忘记超时:“他打开了一张唱片进行编辑,切断了网络电缆,或者去度假了。”。从我的pov解决方案来看,在给定的布局中,它是否起作用实际上并不重要。例如,我会选择JMS,它将查看锁数据库并处理锁/解锁/保留消息

但当锁定机制不是ERP的组成部分时,最大的问题不是“如何锁定”,而是“锁定什么”:
当有人添加新采购订单条目时,我是否能够编辑采购订单的标题?当总会计师编辑客户的信用额度时,是否应允许我发行新的应收账款?等等。在我看来,实现这样的逻辑,从顶级对象到业务逻辑,再到swing输入字段,几乎和从头开始创建新的ERP一样困难。

我认为您实际上是在准备编写自己的消息总线

我不明白你为什么要让客户作为其修改内容的唯一注册人负责

通常,客户机从存储库“签出”资源,存储库管理员负责注册谁签出了哪些资源

您有三个层次:

  • 后端数据存储库
  • 中端信息控制器
  • 前端客户端
更糟糕的是,假设您有一个分布式数据存储库。东京发生的变化需要实时同步到伦敦、新加坡、上海和纽约

实时

首先,您需要理解并定义“实时”的含义。Real time(实时)是允许的最大延迟时间,它可以防止进程失步。甚至,在您的流程可以容忍的失相量范围内的最大时间延迟

异相意味着您正在从上一个流程运行/决策周期接收数据,以配置当前流程运行/决策周期

在战斗机中,实时意味着微秒或纳秒。在炼油厂,实时可能意味着10毫秒甚至秒。在全球范围内的制造业运营中,实时可能意味着一次8小时的轮班

在您的情况下,需要定义两组实时延迟

  • 使用存储库的存储库控制流程
  • 与客户端的存储库控制过程
让我们假设,尽管与问题无关,但您的全球存储库同步的实时性是4小时,即存储库和存储库控制进程之间允许的最大延迟时间是4小时,而不是几秒钟。这将为客户端同步提供足够的呼吸空间

存储库看板

我使用非标准术语看板来强调代币的作用,以便您可以通过谷歌搜索该术语并理解其含义

存储库控制流程将由看板经理/登记员负责。客户端不应该是已签出的资源的寄存器。将有各种类型的看板

  • 阅读看板
  • 写看板
  • 状态转换/事件看板
您将了解读写令牌的用途,但什么是状态更改令牌?在ERP和MRP中,状态转换和事件构成了系统监控能力的主干
updateGrade(resourceA){
  case (Extreme):
  updatePrice(resourceA);
  case (Premium):
  notify(productMgrA)
  case (Downgrade):
  scrap (ProductA)
}