2012-03-23 45 views
0

我有一個允許用戶編輯客戶實體的GWT(+ GAE)web應用程序。當用戶開始編輯時,lockedByUser屬性在Customer實體上設置。當用戶完成編輯客戶時,lockedByUser屬性被清除。 沒有客戶實體可以同時由2個用戶修改。如果用戶試圖打開已由其他用戶打開的客戶屏幕,他會得到一個「用戶ABC正在修改客戶XYZ」。GWT:實體的實際解鎖

問題是,什麼是最實用和最健壯的方式來處理用戶強行關閉瀏覽器並因此lockedByUser屬性未被清除的情況。

我的第一個想法是在用戶端計時器,每隔30秒左右更新一次lockRefreshedTime。一個不同的用戶試圖修改客戶然後會查看lockRefreshedTime,如果刷新發生在35秒之前,那麼它會通過設置lockedByUser和更新lockRefreshedTime來獲取鎖。

感謝, 馬加什

回答

2

FWIW,您的鎖定失效方法是WebDAV使用的方法(例如在Microsoft Word等工具中實現)。
爲了應對網絡延遲,您應該至少在鎖定時間的一半時間內更新鎖定(例如,鎖定在2分鐘後過期,並且每分鐘更新一次)。
查看關於客戶端和服務器應該如何表現的更多細節:http://tools.ietf.org/html/rfc4918#section-6(請注意,例如,他們總是認爲失敗是可能的:「客戶端不能假定僅僅因爲超時未到期,鎖仍然存在「;請參閱http://tools.ietf.org/html/rfc4918#section-6.6

另一種方法是具有顯式鎖定/解鎖流程,而不是隱式流程。

或者,您可以允許多個用戶同時使用「一次一個字段」方式更新客戶:發送RPC以更新該字段上每個ValueChangeEvent上的特定字段。處理衝突(另一個用戶更新了該字段)會變得更簡單一些,或者可以簡單地忽略:如果用戶A將客戶地址從「foo」更改爲「bar」,則意味着在該字段中設置「bar」 ,不要將_from「foo」更改爲「bar」,所以如果服務器上的實際值已經由用戶B從「foo」更新爲「baz」,那不會是一個問題,用戶A可能有仍然將值設置爲「bar」,將其從「foo」或「baz」更改爲無關緊要。
使用每字段方法時,「隱式鎖定」(編輯和發送更改到服務器所需的時間)要短得多,因爲它們被縮減爲單個字段。
然後,「挑戰」是當另一用戶向編輯的客戶保存更改時,近乎實時地更新表單;或者你可以選擇不這樣做(不要試圖近乎實時地做)。

-1

要走的路是這樣的: Execute code on window close in GWT

你要問用戶確認才能真正關閉窗口,在編輯模式。

如果用戶真的想退出,您可以發送解鎖呼叫。

+0

OP要求一個_robust_方法。你提出的那個不是。 – 2012-03-24 14:34:49

+0

我同意。你的回答令人印象深刻 – 2012-03-25 12:03:24