Java 如何在三层web服务后端桌面应用程序中实现异步通知?
我们有一个ERP应用程序。服务器端实现为一系列使用Hessian和Spring公开的Web服务。Web服务将DAO层用于所有数据库操作。DAO是使用Hibernate实现的。客户端是JavaSwing。它将Web服务用于所有与数据相关的操作 问题是,如果有另一个客户端同时编辑同一行,则需要阻止某些行被编辑。此外,每当客户机编辑一行时,所有其他客户机都应使用更新的值更新该行。解决方案必须考虑到客户端可能显示相同的数据,但视图不同(例如,在一个客户端中过滤相同的数据,在另一个客户端中不过滤相同的数据) 客户端之间的套接字连接是不可能的,因为应用程序需要通过防火墙工作,而不需要额外的配置。持续轮询服务器以获取更新的功能无法很好地扩展,因为我们正在研究数百个并发客户端 看看我的选择,我考虑了JMS,但在花了2天时间尝试用Spring配置ActiveMQ后,我最终放弃了(我以前没有JMS方面的经验,团队也没有)。然而,对于我们这里需要的东西来说,它似乎太复杂了。最后,我使用优秀的websockets实现了一些东西,在客户端上破解了一个新的表侦听器、单元格编辑器和表模型之后,它开始工作了 但我仍然担心客户端负责跟踪可编辑/不可编辑的单元格、添加和删除的行等。从我的角度来看,这个解决方案太脆弱了。在任何给定的时间内,消息都可能丢失,并且所有客户端都会在其状态之间失去同步Java 如何在三层web服务后端桌面应用程序中实现异步通知?,java,web-services,notifications,desktop-application,Java,Web Services,Notifications,Desktop Application,我们有一个ERP应用程序。服务器端实现为一系列使用Hessian和Spring公开的Web服务。Web服务将DAO层用于所有数据库操作。DAO是使用Hibernate实现的。客户端是JavaSwing。它将Web服务用于所有与数据相关的操作 问题是,如果有另一个客户端同时编辑同一行,则需要阻止某些行被编辑。此外,每当客户机编辑一行时,所有其他客户机都应使用更新的值更新该行。解决方案必须考虑到客户端可能显示相同的数据,但视图不同(例如,在一个客户端中过滤相同的数据,在另一个客户端中不过滤相同的数据
我的问题是,考虑到当前的体系结构,您将如何实现这个需求?如果更改后端是一个选项,您会更改什么以使此需求更易于实现?在我看来,Web服务体系结构的无状态性质,加上我们正在使用Hibernate,而且据我所知,当请求修改可能分离的对象时,无法收到通知,这使得事情变得比实际情况更复杂 由于所提到的web服务的无状态性质,除了维护和定期查询/更新特定记录的锁状态(锁所有者、锁类型、timestammp等),什么都没有了。不要忘记超时:“他打开了一张唱片进行编辑,切断了网络电缆,或者去度假了。”。从我的pov解决方案来看,在给定的布局中,它是否起作用实际上并不重要。例如,我会选择JMS,它将查看锁数据库并处理锁/解锁/保留消息 但当锁定机制不是ERP的组成部分时,最大的问题不是“如何锁定”,而是“锁定什么”:
当有人添加新采购订单条目时,我是否能够编辑采购订单的标题?当总会计师编辑客户的信用额度时,是否应允许我发行新的应收账款?等等。在我看来,实现这样的逻辑,从顶级对象到业务逻辑,再到swing输入字段,几乎和从头开始创建新的ERP一样困难。我认为您实际上是在准备编写自己的消息总线 我不明白你为什么要让客户作为其修改内容的唯一注册人负责 通常,客户机从存储库“签出”资源,存储库管理员负责注册谁签出了哪些资源 您有三个层次:
- 后端数据存储库
- 中端信息控制器
- 前端客户端
- 使用存储库的存储库控制流程
- 与客户端的存储库控制过程
- 阅读看板
- 写看板
- 状态转换/事件看板
updateGrade(resourceA){
case (Extreme):
updatePrice(resourceA);
case (Premium):
notify(productMgrA)
case (Downgrade):
scrap (ProductA)
}