转载

[翻译] AKKA笔记- ACTORSYSTEM (配置CONFIGURATION 与调度SCHEDULING) - 4(一)

原文在http://rerun.me/2014/10/06/akka-notes-actorsystem-in-progress/

像我们前面看到的,我们可以用 ActorSystemactorof 方法来创建Actor。其实你可以用ActorSystem做更多事。我们可以先看下Configuration和Scheduling。

让我们先看下 ActorSystem 的方法。

[翻译] AKKA笔记- ACTORSYSTEM (配置CONFIGURATION 与调度SCHEDULING) - 4(一)

1. 配置管理

还记得 前一篇 我们用 application.conf 文件来配置我们的日志级别吗?这个文件跟java里用的 .properties 文件很像。我们马上会看到我们如何用这个配置文件来自定义我们的dispatchers(分发器), mailboxes(邮箱)等。(我还没好好介绍 typesafe config 的神奇, 请自己去看一些 例子 来领略吧)

所以,当我们不指定任何配置用ActorSystem对象的 apply 方法创建ActorSystem时,他会自动在classpath的根路径上加载 application.conf,application.jsonapplication.properties

所以,

val system=ActorSystem("UniversityMessagingSystem")

等价于

val system=ActorSystem("UniversityMessagingSystem", ConfigFactory.load())

想验证这个参数, 只要看下 ActorSystem.scala 的apply方法

  def apply(name: String, config: Option[Config] = None, classLoader: Option[ClassLoader] = None, defaultExecutionContext: Option[ExecutionContext] = None): ActorSystem = {     val cl = classLoader.getOrElse(findClassLoader())     val appConfig = config.getOrElse(ConfigFactory.load(cl))     new ActorSystemImpl(name, appConfig, cl, defaultExecutionContext).start()   }

A. 覆盖缺省的配置

如果你不想使用 application.conf (例如在testcase中)或者你想有你自己的自定义配置文件(例如在测试不同的配置文件或部署在不同的环境),你可以用传入你自己的配置文件来覆盖那个在classpath上的配置文件。

ConfigFactory.parseString是个选择

val actorSystem=ActorSystem("UniversityMessageSystem", ConfigFactory.parseString("""akka.loggers = ["akka.testkit.TestEventListener"]"""))  

或者简单的在testcase中写

class TeacherTestLogListener extends TestKit(ActorSystem("UniversityMessageSystem", ConfigFactory.parseString("""akka.loggers = ["akka.testkit.TestEventListener"]""")))     with WordSpecLike   with MustMatchers   with BeforeAndAfterAll {

还有一个ConfigFactory.load方式

val system = ActorSystem("UniversityMessageSystem", ConfigFactory.load("uat-application.conf"))  

如果你需要在runtime时访问你自己的配置文件, 你可以这样做:

val system=ActorSystem("UniversityMessageSystem", ConfigFactory.parseString("""akka.loggers = ["akka.testkit.TestEventListener"]"""))   println (system.settings.config.getValue("akka.loggers")) // Results in > SimpleConfigList(["akka.testkit.TestEventListener"])

B. 扩展缺省配置

不同于覆盖,你还可以用扩展的方式来扩展缺省配置文件,只要用 Config 的 withFallback 方法。

假如你的 application.conf 是这样的:

akka{       loggers = ["akka.event.slf4j.Slf4jLogger"]     loglevel = DEBUG     arun="hello" }

并且你打算这样覆盖你的 akka.loggers 属性:

   val config=ConfigFactory.parseString("""akka.loggers = ["akka.testkit.TestEventListener"]""")    val system=ActorSystem("UniversityMessageSystem", config.withFallback(ConfigFactory.load()))

最终merge过得配置文件是这样的的

   val config=ConfigFactory.parseString("""akka.loggers = ["akka.testkit.TestEventListener"]""")    val system=ActorSystem("UniversityMessageSystem", config.withFallback(ConfigFactory.load()))     ``` 为什么我要说这个配置的事?因为我们的*ActorSystem*是加载并提供存取所有配置信息的点。  --- ###重要笔记: 请注意下falling back的顺序 - 哪一个是缺省,哪一个是扩展配置。 请记住,你需要(fall back)回滚到缺省配置。所以,

config.withFallback(ConfigFactory.load())

可以工作 但是

ConfigFactory.load().withFallback(config)

```

得不到你想要的结果。

文章来自微信平台「麦芽面包」,微信号「darkjune_think」。转载请注明。

正文到此结束
Loading...