close
文章出處

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

像我們前面看到的,我們可以用ActorSystemactorof方法來創建Actor。其實你可以用ActorSystem做更多事。我們可以先看下Configuration和Scheduling。

讓我們先看下ActorSystem 的方法。

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. 擴展缺省配置

不同于覆蓋,你還可以用擴展的方式來擴展缺省配置文件,只要用ConfigwithFallback方法。

假如你的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
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()