我正在运行一个客户端-服务器设置,其中有一个服务器应用程序和多个客户端(客户端使用JavaFX和Android编写)。
我需要一种将对某些数据库对象的访问限制为一次只能访问一个设备的方法。因此,如果一个设备正在使用该对象,则其他设备都不能使用它,直到使用它的设备完成其任务(如锁)为止。
我们在服务器上使用带有MongoDB的Spring Boot,客户端可以通过HTTP请求连接到它。
挑战
客户端(尤其是Android)可能永远不会释放锁,因为它可能会被杀死/关闭/网络丢失
示例
我们有1个资源对象Order-12。
我们有2个运行Android的客户端Client-A和Client-B。
我们有1台运行Tomcat和MongoDB的服务器。
客户A要访问12号订单。它请求来自服务器的访问。服务器进行一些检查(可以是表列,甚至可以是内存中的哈希图),并可以访问Client-A。
在处理Order 12期间,客户端A耗尽了电池并立即关闭。结果,服务器没有收到客户端A发出的释放Order-12锁的请求。
现在另一个客户端Client-B要访问Order-12。它请求来自服务器的访问。服务器进行检查(如前所述,可以从数据库甚至是地图中进行检查),并看到Client-A已经在使用Order-12。因此,服务器将拒绝客户端B访问Order-12,因为它仍然认为客户端A正在使用它,尽管由于电池问题客户端A已经关闭,现在情况不再如此。
任何帮助将不胜感激。