理论教育 Scala语言开发实战:创建Transactor

Scala语言开发实战:创建Transactor

时间:2023-11-24 理论教育 版权反馈
【摘要】:下面使用Transactor完成11.3.5小节中相同的转账功能。首先创建一个MoneyTransactor继承自Transactor,在MoneyTransactor中定义一个使用Ref包裹STM变量,该变量是一个共享变量,表示账户余额。Transactor继承自Actor,有preRestart方法,因此可以重用这个方法。当Transactor收到协作事务之外的消息,它会产生一个新的事务并执行消息。接下来,将实现Tranfer Actor并让它作为一个Transactor。在Transfer Actor需要将两个账户包含到协作事务中。至此,Transactor所有的讲解基本上结束。使用Transactor可以隐藏使用协作事务,并且可以减少代码量。

Scala语言开发实战:创建Transactor

Transactor是一种特别的Actor,它包含了协作事务。Transactor中有很多的方法可以使用,可以重写必要的方法,而不需要关心Coordinated类,这样就可以将精力放到业务逻辑处理上来,而不需要花费额外的精力去创建和维护Coordinated类了。

下面使用Transactor完成11.3.5小节中相同的转账功能。首先创建一个MoneyTransactor继承自Transactor,在MoneyTransactor中定义一个使用Ref包裹STM变量,该变量是一个共享变量,表示账户余额。

在atomically代码块中,处理存钱取钱逻辑,代码如下所示。

使用Transactor,需要继承Akka中的Transactor,不需要实现receive方法,但是要实现一个叫atomically的方法,在这个方法中要实现取款和存款逻辑。atomically中的方法都是在协作事务中执行的,但是所有协作的代码都被隐藏了。前面实现的GetBalance不是事务的一部分,因此可以把这部分代码放入nomally方法中。在nomally方法中的代码不会传递给atomically方法,因此在这个方法中,可以实现普通Actor的行为,当然在nomally方法中也可以使用普通的STM原子块实现本地事务。

Transactor继承自Actor,有preRestart方法,因此可以重用这个方法。现在,可以在事务中像使用协作Actor那样使用Transactor了。如下代码,首先初始化两个账户account1、account2,从account1账户取出50存入account2中,完成转账功能。

当Transactor收到协作事务之外的消息,它会产生一个新的事务并执行消息。例如,当向一个账户存入一些钱,这个操作不需要在协作事务中处理。因此可以使用如下的操作。(www.daowen.com)

这两行代码和上面atomic块中的代码都是等效的。接下来,将实现Tranfer Actor并让它作为一个Transactor。在Transfer Actor需要将两个账户包含到协作事务中。为了实现这个,需要实现coordinate方法。下面是coordinate方法代码。

在上面代码中,需要将消息发送到两个Actor,发送“取款”消息到“from”Actor,发送“存款”消息到“to”Actor。要这样,需要包含两个Actor到Transactor中。当需要将收到的消息发送其他Actor时,可以使用include方法,如下所示。

上面代码将收到的消息发送给其他3个Actor。在atomically方法执行前,会先执行before方法,执行之后会执行after方法。在这里,当事务执行成功时,使用after方法发送“成功”消息。after代码如下所示。

至此,Transactor所有的讲解基本上结束。使用Transactor可以隐藏使用协作事务,并且可以减少代码量。在Transactor中可以增加Actor到事务中,也可以实现普通的行为,通过重写before和after方法或者使用normally方法,可以完全跳过事务。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈