原文在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

所以,

  1. val system=ActorSystem("UniversityMessagingSystem")

等价于

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

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

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

A. 覆盖缺省的配置

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

ConfigFactory.parseString是个选择

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

或者

简单的在testcase中写

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

还有一个ConfigFactory.load方式

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

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

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

B. 扩展缺省配置

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

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

  1. akka{
  2. loggers = ["akka.event.slf4j.Slf4jLogger"]
  3. loglevel = DEBUG
  4. arun="hello"
  5. }

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

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

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

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

config.withFallback(ConfigFactory.load())

  1. 可以工作
  2. 但是

ConfigFactory.load().withFallback(config)

  1. 得不到你想要的结果。
  2. [1]: /img/bVryIX
  3. ---
  4. 文章来自微信平台「麦芽面包」,微信号「darkjune_think」。转载请注明。

[翻译] AKKA笔记- ACTORSYSTEM (配置CONFIGURATION 与调度SCHEDULING) - 4(一)的更多相关文章

  1. [翻译]AKKA笔记 -ACTOR SUPERVISION - 8

    失败更像是分布式系统的一个特性.因此Akka用一个容忍失败的模型,在你的业务逻辑与失败处理逻辑(supervision逻辑)中间你能有一个清晰的边界.只需要一点点工作,这很赞.这就是我们要讨论的主题. ...

  2. [翻译]AKKA笔记 - ACTOR生命周期 - 基本 -5

    原文地址:http://rerun.me/2014/10/21/akka-notes-actor-lifecycle-basic/ (请注意这了讨论的生命周期并不包括 preRestart 或者pos ...

  3. [翻译]AKKA笔记 - ACTOR MESSAGING - REQUEST AND RESPONSE -3

    上次我们看Actor消息机制,我们看到开火-忘记型消息发出(意思是我们只要发个消息给Actor但是不期望有响应). 技术上来讲, 我们发消息给Actors就是要它的副作用. 这就是这么设计的.除了不响 ...

  4. [翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (二)

    3.THROW IN A LOGBACK.XML 现在我们把SLF4J日志配置在logback. <?xml version="1.0" encoding="UTF ...

  5. [翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6

    原文:http://rerun.me/2014/10/21/akka-notes-child-actors-and-path/ Actor是完全的继承结构.你创建的任何Actor肯定都是一个其他Act ...

  6. [翻译]AKKA笔记 - DEATHWATCH -7

    当我们说Actor生命周期的时候,我们能看到Actor能被很多种方式停掉(用ActorSystem.stop或ActorContext.stop或发送一个PoisonPill - 也有一个kill和g ...

  7. [翻译]AKKA笔记 - LOGGING与测试ACTORS -2 (一)

    在前两章 ( 一 , 二 ) ,我们大致讲了Actor和message是怎么工作的,让我们看一下日志和测试我们的 TeacherActor . RECAP 这是上一节我们的Actor代码: class ...

  8. [翻译]AKKA笔记 - 有限状态机 -1

    原文地址:http://rerun.me/2016/05/21/akka-notes-finite-state-machines-1/ 我最近有个机会在工作上使用了Akka FSM,是个非常有趣的例子 ...

  9. 翻译:AKKA笔记 - Actor消息 -1(一)

    从第一篇Akka笔记的介绍中,我们是从很高的高度去观察Akka工具箱中的Actors.在这篇笔记的第二篇,我们会看一下Actors中的消息部分.而且延续上一次的例子,我们还会使用同样的学生与老师的例子 ...

随机推荐

  1. 【转】C# 控件的自定义拖动、改变大小方法

    在用VS的窗体设计器时,我们可以发现控件都是可以拖动的,并且还可以调整大小.怎么在自己的程序中可以使用上述功能呢? 下面的方法值得借鉴! using System; using System.Wind ...

  2. Mongodb集群搭建的三种方式

    转自:http://blog.csdn.net/luonanqin/article/details/8497860 MongoDB是时下流行的NoSql数据库,它的存储方式是文档式存储,并不是Key- ...

  3. C#改善程序的50种方法

    作者: suyan010203  来源: 博客园  发布时间: 2011-07-09 14:47  阅读: 11976 次  推荐: 8   原文链接   [收藏] 从去年找工作以来,都没什么时间写博 ...

  4. Angular表单验证

    novalidate   去掉html5自带的验证 ng-minlength    规定输入文本的最小长度 ng-maxlength    规定输入文本的最大长度 ng-submit  接收一个方法名 ...

  5. Spark性能优化-coalesce(n)

    有时用Spark 运行Job 的时候,输出可能会出现一些空或者小内容.这时重新将输出的Partition 进行重新调整,可以减少RDD中Patition的数目. 两种方式: 1. coalesce(n ...

  6. POJ3461 KMP 模板题

    最近忙着考研复习,所以刷题少了.. 数据结构昨天重新学习了一下KMP算法,今天自己试着写了写,问题还不少,不过KMP算法总归是理解了,以前看v_JULY_v的博客,一头雾水,现在终于懂了他为什么要在算 ...

  7. (转) 注意啦,笔记本是无线的,虚拟机上网方式莫用NAT,好难整。

    有线网络 在有线网络的条件下,vmware的安装非常简单,上网方式几乎不用怎么设置(默认 NAT模式) 如果默认情况下不能上网,则按以下步骤尝试: ************************** ...

  8. 批量设置select为默认项

    app.$form.find("select").prop("selectedIndex", 0);

  9. [机器学习] 深度学习之caffe1——软件配置与测试

    caffe的编译配置真的是很让人头疼啊,不知道试过多少次了~~~ 重装系统了七八次,搞得linux的一些常用命令倒是很熟悉了~~~ 我有洁癖~~~某一个点上出了错,我一定要把它搞好了,再重新来一次,我 ...

  10. 浅说如何制作javascript类库

    理论 对于静态的类来说,JavaScript 对象直接量就已经够用了,但使用继承和实例来创建经典的类往往更有帮助. JavaScript 是基于原型的编程语言,并没有包含内置类的实现. 但通过Java ...