Akka中使用Typesafe配置库读写配置文件,Typesafe库支持多种格式的配置文件,目前支持properties、json、conf三种格式的配置文件。
●application.properties:该类型的文件配置格式和Java中properties配置文件格式一样。用于配置键值对形式的变量和值,格式如key=value。
●application.json:该类型的配置文件书写格式遵循JSON格式规范。
●application.conf:该文件中书写HOCON格式的配置,HOCON格式类似于Json,但比
Json更易读。
Typesafe库是一个非常实用的工具库,它不依赖其他任何的库。要在项目中使用Type⁃safe库来读取配置文件,只需要在项目中引入该库即可。使用IntelliJ IDEA开发工具,新建SBT项目,并在build.sbt文件中配置好Typesafe依赖,SBT(英文全称叫Simple Build Tool,是一款IntelliJ IDEA集成好的工具,类似于Maven)工具将会自动到对应的仓库中下载Typesafe库。例12-1是SBT项目中build.sbt配置文件内容。
【例12-1】在SBT项目中的build.sbt文件中引入Typesafe库配置示例。
在build.sbt中配置好库依赖之后保存,SBT工具将自动下载Typesafe的依赖Jar包到工程中。引入Typesafe库后,便可使用Typesafe库提供的便捷的API来读取配置文件了。Typesafe配置库会默认加载工程根目录中的application.properties、application.conf、applica⁃tion.json配置文件。
在下面的案例中,使用结构与Json类似的HOCON格式的配置文件,体会Typesafe库的使用,例12-2所示为application.conf的配置文件,在该配置文件中配置操作数据库的一些属性。database表示数据库的配置,dbname表示数据库名称,dbversion表示数据库的版本号。database中嵌套定义一个connect对象,该对象中定义了连接数据库的三个属性和值,分别是url、username、password,对应数据库连接地址、数据库用户名称、登录数据库的密码。
【例12-2】application.conf配置文件应用示例。
application.conf配置文件的书写跟.json很相似,并且比.json更易读,表达更清晰,特别适合配置属性的分组描述。上述配置文件中的database表示一个配置对象,大括号里面是database的属性,并且在大括号里面支持嵌套的定义,如application.conf中嵌套定义了con⁃nect。
为了得到application.conf中的配置,需要用Typesafe库中的ConfigFactory。使用Config⁃Factory的load方法将会默认加载工程根目录下的application.conf配置文件。例12-3是Con⁃figFactory的使用示例。
【例12-3】ConfigFactory的使用。
ConfigFactory将会找到默认的配置文件,这些默认的配置文件可以有多种格式。可以是上文提到的application.{properties、conf、json}、reference.conf中的一个或多个。这里只添加application.conf配置文件。ConfigFactory将会找到并加载application.conf配置文件。Config⁃Factory的load方法将会返回一个Config对象,通过该对象提供的方法,就能取出配置文件中的内容。
要得到配置文件中的配置,Config提供了多个方法,例如,要得到dbname可以使用con⁃fig.getString(“dbname”),使用config.getString(“dbversion”)可以得到数据库的版本号,但是怎样得到嵌套的内容呢?可以使用“.”来分隔路径,例如要得到url,可以使用config.getString(“database.connect.url”),也可以通过val subConfig=config.getConfig(“database.connect”)得到subConfig,然后通过subConfig.getString(“url”)方法得到想要的内容。使用这种方式时不必写属性的全路径,只需要写出subConfig子树下面的路径即可。例12-4是ConfigFactory使用的一些方法示例。(www.daowen.com)
【例12-4】读取配置文件并打印控制台。
在配置文件中,如果一个配置属性出现多次,并且该属配置要发生变动,那就不得不冒着风险更改配置文件中所有的这个属性。有没有更好的方法解决这个问题呢?幸运的是强大的Typesafe库解决了这个问题。通过在配置文件中定义变量,配置文件中其他地方需要这个配置只需要通过${name}引用该变量即可。这样有一个最大的好处,就是如果配置中多处使用了该变量,要更改变量的值,只需要更改定义的变量的值即可。application.conf配置文件还可以写成例12-5所示的代码。
【例12-5】配置文件中使用变量。
在例12-5中,定义了两个变量serverip和serverport,并且在database中通过${server⁃ip},${serverport}引用了两个变量。
Typesafe的强大不止于此,在配置文件中可以通过${?varia⁃ble}的方式获得操作系统中配置的环境变量的值。例如系统中配置了JAVA_HOME环境变量,可以通MY_JAVA_HOME=${?JAVA_HOME}来获取配置的JAVA HOME环境变量,并赋值给变量MY_JAVA_HOME,在配置文件中就可以通过${MY_JAVA_ HOME}引用环境变量了。
在上面的讲述中,ConfigFactory加载默认的application.{conf、properties、json},如果这些配置文件中都配置了同一个属性,那么哪一个文件中的配置会实际生效呢?这里有一个属性的优先级,如图12-1所示。
图12-1 属性优先级
从上到下依次是系统属性、application.conf、application.json、application.properties、reference.conf。越往下优先级越低。即如果System properties、application.conf和reference.conf中都配置有同一个属性,那么按照这个优先级规则,实际生效的是System properties中的属性。
如果要加载其他名称的配置文件该怎么办呢?这里可以使用ConfigFactory的重载方法,通过ConfigFactory.load(“configname”)的方式来加载configname.{conf、properties、json}配置文件。
至此,熟悉了Typesafe库的使用,那么Akka中是如何应用Typesafe库来加载配置文件的呢?怎样覆盖Akka默认的配置呢?如果有多个ActorSystem,如何保证每一个ActorSystem实例化的时候都加载自己的配置文件呢?
在Akka中,如果没有创建配置文件,系统会使用默认的配置,但是也可以使用自己的配置,通过val config=ConfigFactory.load(“your config”)装载自己的配置文件,然后在实例化ActorSystem的时候,将config对象传入ActorSystem的构造函数即可,如:val sysa=ActorSystem(“myactorsystem”,config)。ActorSystem中传入了自己的配置之后,可以通过ActorSystem.setting.config的方法得到相应的配置。例如,要得到传入的dbname,可以通过例12-6得到。
【例12-6】得到ActorSystem中的配置参数示例。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。