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

时间:2011-09-06 00:39:37

标签: java web-services notifications desktop-application

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

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

客户端之间的套接字连接是不可能的,因为应用程序需要在没有其他配置的情况下通过防火墙工作。连续轮询服务器以获取更新并不能很好地扩展,因为我们在这里寻找数百个并发客户端。

看看我的选项,我考虑过JMS但是在花了两天时间尝试用Spring配置ActiveMQ后,我终于放弃了(我以前没有JMS的经验,团队也没有)。尽管如此,这似乎对我们在这里需要的东西来说太复杂了。最后,我使用优秀的Java-WebSocket library使用websockets实现了一些东西,并且在客户端上攻击新的表监听器,单元编辑器和表模型后,它正在工作。

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

我的问题是,鉴于目前的架构,您将如何实现此要求?如果更改后端是一个选项,您会更改什么以使此要求更容易实现?在我看来,Web服务体系结构的无状态特性,加上我们正在使用Hibernate的事实,并且我知道在请求修改可能已分离的对象时无法通知,这使得事情变得比它们应该更复杂是。

2 个答案:

答案 0 :(得分:1)

由于提到了Web服务的无状态特性,所以没有什么可以保留并定期查询/更新特定记录的锁状态(锁所有者,锁类型,时间戳等)。不要忘记超时:“他打开了一个编辑记录,切断了他的网络电缆或去休假”。从我在给定布局中的pov解决方案实际上并不重要,如果它做它的工作。我会以JMS为例,它将调查锁数据库并处理锁定/解锁/保持活动消息。

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

答案 1 :(得分:0)