软件事务内存导论(六)配置Akka事务

简介:

配置Akka事务

默认情况下,Akka为其相关的运行参数都设定了默认值,我们可以通过代码或配置文件akka.conf来更改这些默认设置。如果想了解如何指定或修改该配置文件位置的详细信息,请参阅Akka的文档。

针对单个事务,我们可以利用TransactionFactory在程序代码中更改其设置。下面就让我们用这种方式先后在Java和Scala中更改一些设置来为你展示如何实现设置的变更。


在Java中对事务进行配置

public  class  CoffeePot  {
	private  static  final  Ref<Integer>  cups  =  new  Ref<Integer>(24);
	public  static  int  readWriteCups(final  boolean  write)  {
		final  TransactionFactory  factory  =
		new  TransactionFactoryBuilder().setReadonly(true).build();
		return  new  Atomic<Integer>(factory)  {
			public  Integer  atomically()  {
				if(write)  cups.swap(20);
				return  cups.get();
			}
		}.execute();
	}

为了能够用编程的方式对事务进行配置,我们需要一个TransactionFactory实例对象,而 TransactionFactoryBuilder则为我们提供了很多方便的函数用于创建该Factory。在上例中,我们创建了一个 TranactionFactoryBuilder实例对象,并调用该对象的setReadonly()函数来为TransactionFactory添 加readonly选项。由于TransactionFactoryBuilder实现了Cascade[1]设 计模式,所以我们可以将更多用于改变事务属性的函数串在一起挂在TransactionFactoryBuilder构造函数之后、build()函数之 前。随后我们把factory的实例对象作为Atomic的一个构造函数参数传给它,这样就保证了该事务内的所有操作都不会变更任何托管引用。

通过上述设置我们已经将readWriteCups()变成了一个只读事务,接下来你肯定希望了解在一个只读事务中试图改变引用的值将会产生什么后 果。下面我们会调用两次readWriteCups(),第一次仅仅是读取cups引用的内容,而第二次调用则会尝试改变cups引用的值。

	public  static  void  main(final  String[]  args)  {
		System.out.println("Read  only");
		readWriteCups(false);
		System.out.println("Attempt  to  write");
		try  {
			readWriteCups(true);
		}  catch(Exception  ex)  {
			System.out.println("Failed  "  +  ex);
		}
	}
}

由于被设置成了只读,所以readWriteCups()事务不欢迎变更请求。于是当我们试图更改cups引用的值时,系统抛出了org.multiverse.api.exceptions.ReadonlyException异常,并且整个事务也将回滚。

Read  only
Attempt  to  write
Failed  org.multiverse.api.exceptions.ReadonlyException:
Can't  open  for  write  transactional  object  'akka.stm.Ref@1272670619'
because  transaction  'DefaultTransaction'  is  readonly'

上述运行时异常是在调用引用的swap()的时候抛出来的。该函数的作用是当且仅当新值与当前值不同时,将其引用改为指向新值的地址;否则,该函数 将忽略变更请求。所以在本例中,如果我们在调用swap()时将参数20换成与当前cpus引用的值相等的24,则系统就不会抛出任何异常。

在Scala中对事物进行配置

在Scala中,我们可以使用atomic()函数代替Atomic类来创建事务,该函数在使用时需要一个TransactionFactory类 型的可选参数。同时,由于我们能够在伙伴对象(companion object)上使用工厂方法,所以创建factory实例也比在Java中要简单许多。

object  CoffeePot  {
	val  cups  =  Ref(24)
	def  readWriteCups(write  :  Boolean)  =  {
		val  factory  =  TransactionFactory(readonly  =  true)
		atomic(factory)  {
			if(write)  cups.swap(20)
			cups.get()
		}
	}
	def  main(args  :  Array[String])  :  Unit  =  {
		println("Read  only")
		readWriteCups(false)
		println("Attempt  to  write")
		try  {
			readWriteCups(true)
		}  catch  {
			case  ex  =>  println("Failed  "  +  ex)
		}
	}
}

除了在代码方面保持了Scala和Akka特有的简洁优雅之外,上述代码与Java版本就没有什么其他不同之处了,所以代码的执行结果也毫无意外地和Java版本完全相同。

Read  only
Attempt  to  write
Failed  org.multiverse.api.exceptions.ReadonlyException:
Can't  open  for  write  transactional  object  'akka.stm.Ref@1761506447'
because  transaction  'DefaultTransaction'  is  readonly'

[1]近些年来,特别是随着JVM上新语言的不断涌现,由Kent Beck所著的《Smalltalk Best Practice Patterns》[Bec96]一书中所讨论的一些设计模式又被重新发掘了出来。


文章转自 并发编程网-ifeve.com

相关文章
|
2月前
|
存储 JSON 监控
Higress Controller**不是将配置信息推送到Istio的内存存储里面的**。
【2月更文挑战第30天】Higress Controller**不是将配置信息推送到Istio的内存存储里面的**。
16 1
|
11天前
|
存储 弹性计算 固态存储
阿里云服务器CPU内存配置详细指南,如何选择合适云服务器配置?
阿里云服务器配置选择涉及CPU、内存、公网带宽和磁盘。个人开发者或中小企业推荐使用轻量应用服务器或ECS经济型e实例,如2核2G3M配置,适合低流量网站。企业用户则应选择企业级独享型ECS,如通用算力型u1、计算型c7或通用型g7,至少2核4G配置,公网带宽建议5M,系统盘可选SSD或ESSD云盘。选择时考虑实际应用需求和性能稳定性。
118 6
|
4天前
|
消息中间件 监控 NoSQL
中间件应用合理配置内存
中间件应用合理配置内存
11 2
|
5天前
|
运维 Linux Docker
Docker详解(十三)——Docker容器的内存和磁盘I/O限制配置
Docker详解(十三)——Docker容器的内存和磁盘I/O限制配置
14 1
|
4月前
|
监控 关系型数据库 MySQL
innodb_buffer_pool_instances 如何根据cpu和内存进行配置
`innodb_buffer_pool_instances` 是用于配置 InnoDB 缓冲池实例数的参数。每个实例都管理缓冲池的一部分,这有助于提高并发性能。通常,你可以根据系统的 CPU 和内存来调整这个参数,以获得更好的性能。 以下是一些建议和步骤,帮助你根据 CPU 和内存进行 `innodb_buffer_pool_instances` 的配置: 1. **了解系统资源:** 首先,了解系统的硬件资源,特别是内存和CPU。检查系统上可用的物理内存和 CPU 核心数量。 2. **考虑每个实例的大小:** 在配置 `innodb_buffer_pool_instances` 时,
|
2月前
idea配置项目运行时内存大小
idea配置项目运行时内存大小
48 0
|
2月前
|
弹性计算 固态存储 调度
阿里云服务器部署配置选择全攻略,ECS实例规格、CPU内存配置
阿里云服务器部署配置选择全攻略,ECS实例规格、CPU内存配置,CPU内存、公网带宽和系统盘怎么选择?个人用户选择轻量应用服务器或ECS通用算力型u1云服务器,企业用户选择ECS计算型c7、通用型g7云服务器,阿里云百科分享阿里云服务器配置选择方法
|
2月前
|
弹性计算 固态存储 调度
阿里云配置服务器详细指南_2024新版CPU内存带宽系统盘选择
阿里云配置服务器详细指南_2024新版CPU内存带宽系统盘选择,阿里云服务器配置怎么选择?CPU内存、公网带宽和系统盘怎么选择?个人用户选择轻量应用服务器或ECS通用算力型u1云服务器,企业用户选择ECS计算型c7、通用型g7云服务器,阿里云百科分享阿里云服务器配置选择方法
|
6月前
|
NoSQL Redis
redis不落地配置,全内存运行
redis不落地配置,全内存运行
|
6月前
|
Java
IntelliJ IDEA优化内存配置提高启动和运行速度
IntelliJ IDEA优化内存配置提高启动和运行速度
233 0