Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT:实体的实用解锁_Gwt - Fatal编程技术网

GWT:实体的实用解锁

GWT:实体的实用解锁,gwt,Gwt,我有一个GWT(+GAE)webapp,允许用户编辑客户实体。当用户开始编辑时,将在客户实体上设置lockedByUser属性。当用户完成编辑客户时,将清除lockedByUser属性。 2个用户不能同时修改任何客户实体。如果一个用户试图打开另一个用户已经打开的客户屏幕,他会得到“用户ABC正在修改客户XYZ” 问题是,当用户强制关闭浏览器,因此lockedByUser属性未被清除时,处理这种情况的最实用、最稳健的方法是什么 我的第一个想法是在用户端安装一个计时器,每30秒左右更新一次lockR

我有一个GWT(+GAE)webapp,允许用户编辑客户实体。当用户开始编辑时,将在客户实体上设置lockedByUser属性。当用户完成编辑客户时,将清除lockedByUser属性。 2个用户不能同时修改任何客户实体。如果一个用户试图打开另一个用户已经打开的客户屏幕,他会得到“用户ABC正在修改客户XYZ”

问题是,当用户强制关闭浏览器,因此lockedByUser属性未被清除时,处理这种情况的最实用、最稳健的方法是什么

我的第一个想法是在用户端安装一个计时器,每30秒左右更新一次lockRefreshedTime。尝试修改客户的其他用户将查看lockRefreshedTime,如果刷新发生在35秒之前,则会通过设置lockedByUser并更新lockRefreshedTime来获取锁

谢谢, Matyas

要走的路是:

您必须要求用户确认以编辑模式真正关闭窗口

如果用户确实想退出,则可以发送解锁呼叫

FWIW,您的带到期的锁方法是WebDAV使用的方法(例如,在Microsoft Word等工具中实现)。
为了应对网络延迟,您应该在锁的生命周期中至少中途续订锁(例如,锁在2分钟后过期,您每分钟续订一次)。
查看那里,了解更多有关客户端和服务器应如何运行的详细信息:(注意,例如,他们总是假设可能出现故障:“客户端不能因为超时未过期而假设锁仍然存在”;请参阅)

另一种方法是使用显式锁定/解锁流,而不是隐式锁定/解锁流

或者,您可以允许多个用户同时更新客户,使用“一次一个字段”的方法:发送RPC以更新该字段上每个
valuechangevent
的特定字段。处理冲突(另一个用户已经更新了该字段)会变得容易一些,或者可以简单地忽略:如果用户a将客户地址从“foo”更改为“bar”,这实际上意味着在该字段中设置“bar”,而不是将_从“foo”更改为“bar”,因此如果用户B已经将服务器上的实际值从“foo”更新为“baz”,这不是问题,用户a可能仍然会将值设置为“bar”,将其从“foo”或“baz”更改并不重要。
使用每个字段的方法,“隐式锁”(编辑更改并将更改发送到服务器所需的时间)要短得多,因为它们被缩减为单个字段。

“挑战”是当另一个用户将更改保存到已编辑的客户时,近乎实时地更新表单;或者您可以选择不这样做(不要尝试以接近实时的方式进行)。

OP要求提供一种可靠的方法。你提议的不是,我同意。你的回答令人印象深刻。