良い一日!
GWT 2.4 で並行性節約を実装しようとしました。ユーザーケースがあります:
- ユーザー John と Jim が 1 つのエンティティを開いて編集する
- John は変更を保存します。大丈夫。
Jim は変更を保存します。システムが上書きについて尋ねた
を。ジムは上書きしたくありません。システムはページのエンティティを更新するだけです
b. そうしないと、Jim が変更を保存したい場合、変更を保持する必要があり、John の変更は破棄されます。(変更履歴のみ残します)
だから私は3.bに問題があります。
public void save(MyEntityProxy entity){
MyRequest rContext = (MyRequest) driver.flush();
MyProxy myEntity = (MyProxy) rContext.edit(entity);
entitySave(rContext, (MyProxy) myEntity, false);
}
private void entitySave(MyRequest rContext, final MyProxy myEntity, boolean overwrite){
GWT.log("SAVE ENTITY WITH NAME = " + myEntity.getName());
rContext.persist(myEntity, entityVersion, overwrite)
.fire(new Receiver<MyProxy>() {
@Override
public void onSuccess(MyProxy response) {
goToModel();
}
@Override
public void onFailure(ServerFailure error) {
if(isConcurency(error)){
entitySave((MyRequest)getNewRequestContext(), myEntity,true);
}
}
});
}
/*This is a method from MyService for persisting*/
public MyProxy persist(MyProxy entity, Long version, boolean overwrite) {
LOG.info("PERSISTS ENTITY NAME=" + entity.getName());
if(!overwrite && !checkVersionChanged(entity, version)){
System.out.println("RAISE CHANGED_BY_OTHER EXCEPTION");
throw new RuntimeException(CHANGED_BY_OTHER.name());
}
entity = getEntityManager().merge(entity);
getEntityManager().flush();
return entity;
}
isConcurrency は並行性の問題をチェックするためのメソッドであり、ユーザーがダイアログで「上書き」ポイントを選択すると true を返します。
GWT ログ:
SAVE ENTITY WITH NAME = John //There is John changed name of entity
SAVE ENTITY WITH NAME = Jim //There is John changed name of entity
SAVE ENTITY WITH NAME = Jim //There is John overwrites entity
サーバーログ:
[INFO] PERSISTS ENTITY NAME=Jim //There is John changed name of entity
[INFO] SAVE ENTITY NAME=Jim //Persisting of John's changes. Here John finished his work
[INFO] PERSISTS ENTITY NAME=John //There is Jim changed name of entity
[INFO] RAISE CHANGED_BY_OTHER EXCEPTION //Exception raises and dialog shows for Jim
[INFO] PERSISTS ENTITY NAME=John //Second iteration of saving. Look at the name!.
何が起こったのかわかりません。ジムが変更を上書きすると、クライアント層ではすべてが正しくなりますが、サーバー層は前のユーザーによって保存されたデータで機能します。
この状況で変更を正しく上書きする方法を知っている人はいますか?