Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop
还记得在前面我们用于配置日志输出级别的application.conf文件吗?这个配置文件和Java中的.properties文件很类似,我们马上将看到通过这个配置文件可以配置dispatchers和mailboxes 等等。
所以当我们创建ActorSystem,用的是ActorSystem对象的apply方法,而该并没有注明任何的配置,它将在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() }
如果你不喜欢用application.conf,或者想拥有你自己的配置文件。你可以通过重载来传递你自己的配置,而不是从classpat来获取。ConfigFactory.parseString就是一种方法:
val actorSystem=ActorSystem("UniversityMessageSystem", ConfigFactory.parseString("""akka.loggers = ["akka.testkit.TestEventListener"]"""))
或者在你的测试用例用法如下
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"))
如果你想在运行的时候获取你自己的配置参数,你可以通过下面的API获取
val system=ActorSystem("UniversityMessageSystem", ConfigFactory.parseString("""akka.loggers = ["akka.testkit.TestEventListener"]""")) println (system.settings.config.getValue("akka.loggers")) // Results in > SimpleConfigList(["akka.testkit.TestEventListener"])
除了重载,你也可以用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()))
最后你将合并两个地方的配置:
//> ConfigString("hello") println (system.settings.config.getValue("akka.arun")) //> SimpleConfigList(["akka.testkit.TestEventListener"]) println (system.settings.config.getValue("akka.loggers"))
需要注意这里的falling back的顺序:一部分是默认的;一部分是扩展的。记住,你必须对默认的配置进行fall back。所以
config.withFallback(ConfigFactory.load())
可以工作,但是
ConfigFactory.load().withFallback(config)
不可以。
本博客文章除特别声明,全部都是原创!