原文在http://rerun.me/2014/10/06/akka-notes-actorsystem-in-progress/
像我們前面看到的,我們可以用ActorSystem的actorof方法來創建Actor。其實你可以用ActorSystem做更多事。我們可以先看下Configuration和Scheduling。
讓我們先看下ActorSystem 的方法。
1. 配置管理
還記得前一篇我們用application.conf文件來配置我們的日志級別嗎?這個文件跟java里用的.properties文件很像。我們馬上會看到我們如何用這個配置文件來自定義我們的dispatchers(分發器), mailboxes(郵箱)等。(我還沒好好介紹typesafe config的神奇, 請自己去看一些例子來領略吧)
所以,當我們不指定任何配置用ActorSystem對象的apply方法創建ActorSystem時,他會自動在classpath的根路徑上加載application.conf,application.json和application.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」。轉載請注明。
文章列表
![]() |
不含病毒。www.avast.com |