gpt4 book ai didi

java - GWT RequestFactory 是否支持乐观并发控制的实现?

转载 作者:行者123 更新时间:2023-11-30 06:33:46 24 4
gpt4 key购买 nike

在 GWT 应用程序中,我展示了可以由用户编辑的项目。加载和保存项目是使用 GWT 请求工厂执行的。我现在想要实现的是,如果两个用户同时编辑一个项目,则以乐观并发控制的方式先保存的用户获胜。这意味着当第二个用户保存他的更改时,请求工厂后端识别出存储在后端的项目的版本或存在已经改变,因为它已被传输到客户端并且请求工厂/后端然后以某种方式阻止项目被更新/已保存。

我试图在用于保存项目的服务方法中实现这一点,但这不会起作用,因为请求工厂提交了刚刚从后端检索到的项目,并应用了用户的更改,这意味着这些项目的版本是当前版本从后端和比较毫无意义。

我可以利用请求工厂处理中的任何 Hook 来实现请求的行为吗?还有其他想法吗?还是我必须改用 GWT-RPC...

最佳答案

编号:http://code.google.com/p/google-web-toolkit/issues/detail?id=6046

直到实现建议的 API(EntityLocator,在评论 #1 中,但我不清楚如何从其序列化形式重建版本信息),你必须以某种方式将版本发送回服务器。
正如我在问题中所说,这不能通过简单地在代理中提供版本属性并进行设置来完成;但您可以添加另一个属性:获取它总是返回 null(或类似的 nonexistent 值),以便在客户端将其设置为“true”的值"version property 总是会产生变化,这保证了值将作为“property diff”的一部分发送到服务器;在服务器端,您可以在 setter 中处理事情(当 RequestFactory 应用“属性差异”并调用 setter 时,如果值与“真实”版本不同,则抛出异常)或在服务中方法(比较从客户端发送的版本——你从一个不同的 getter 获得的版本与映射到客户端的版本不同,因为那个版本必须总是返回 null——到“真实”版本对象,如果它们不匹配则引发错误)。

类似于:

@ProxyFor(MyEntity.class)
interface MyEntityProxy extends EntityProxy {
String getServerVersion();
String getClientVersion();
void setClientVersion(String clientVersion);

}

@Entity
class MyEntity {
private String clientVersion;
@Version private String serverVersion;

public String getServerVersion() { return serverVersion; }
public String getClientVersion() { return null; }
public void setClientVersion(String clientVersion) {
this.clientVersion = clientVersion;
}

public void checkVersion() {
if (Objects.equal(serverVersion, clientVersion)) {
throw new OptimisticConcurrencyException();
}
}
}

请注意,我还没有对此进行测试,这是纯理论。

关于java - GWT RequestFactory 是否支持乐观并发控制的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7696764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com