在 RMI 中一次只执行一个请求
Execute one and only one request at a time in RMI
为了更好地理解 RMI,我正在 java 中构建小型电子银行项目。
实际上,我考虑过在执行客户向他的银行帐户存入资金的请求时可能出现任何错误的可能性。
换句话说,让我们假设有一个客户想要将钱存入他的银行帐户,因此客户端程序将向服务器发送请求以远程执行远程方法deposit()
。现在假设由于某些错误暂时无法发送请求,因此客户端将发送新请求,因为服务器没有收到第一个请求。第二个请求已正确执行。现在假设过了一段时间,服务器收到第一个请求并执行了,问题来了:请求执行了两次,但客户端只想存钱一次。
到目前为止我尝试的是在客户端table中添加一个名为idRequest的列table(包含idClient和密码和余额)以检查在执行之前是否发送了先前的请求。但似乎不好解决。
我怎样才能更好地解决这个问题(不在数据库中的客户端数据 table 中添加新列来识别最后发送的请求)?
你的问题没有意义。你描述的情况是不可能的。 RMI 客户端在第一个远程方法 returns 之前不能调用第二个远程方法,除非它是多线程的,在这种情况下,简单的解决方案是删除多线程。当方法 returns 它已在服务器上完全执行。
TCP 还可以防止数据乱序到达,尽管 RMI 可以使用多个连接,这有点无关紧要。
您还需要注意 RMI 具有 'at-most-once' 交付语义。
你似乎在发明 none 存在的问题。
但是,出于其他原因,您确实需要查找 'transactional idempotence'。
为了更好地理解 RMI,我正在 java 中构建小型电子银行项目。
实际上,我考虑过在执行客户向他的银行帐户存入资金的请求时可能出现任何错误的可能性。
换句话说,让我们假设有一个客户想要将钱存入他的银行帐户,因此客户端程序将向服务器发送请求以远程执行远程方法deposit()
。现在假设由于某些错误暂时无法发送请求,因此客户端将发送新请求,因为服务器没有收到第一个请求。第二个请求已正确执行。现在假设过了一段时间,服务器收到第一个请求并执行了,问题来了:请求执行了两次,但客户端只想存钱一次。
到目前为止我尝试的是在客户端table中添加一个名为idRequest的列table(包含idClient和密码和余额)以检查在执行之前是否发送了先前的请求。但似乎不好解决。
我怎样才能更好地解决这个问题(不在数据库中的客户端数据 table 中添加新列来识别最后发送的请求)?
你的问题没有意义。你描述的情况是不可能的。 RMI 客户端在第一个远程方法 returns 之前不能调用第二个远程方法,除非它是多线程的,在这种情况下,简单的解决方案是删除多线程。当方法 returns 它已在服务器上完全执行。
TCP 还可以防止数据乱序到达,尽管 RMI 可以使用多个连接,这有点无关紧要。
您还需要注意 RMI 具有 'at-most-once' 交付语义。
你似乎在发明 none 存在的问题。
但是,出于其他原因,您确实需要查找 'transactional idempotence'。