Akka学习笔记(七):配置
使用Akka可以不用任何配置,Akka提供了明智的默认配置。为了适应特别的运行环境,修改默认行为,你可能需要修改:
- log level and logger backend
- enable remoting
- 消息系列化
- 路由设置
- 调度器调优
Akka使用Typesafe Config Library,纯java实现的配置库。之前博客有介绍过here
从哪里读取配置
Akka的所有配置信息装在 ActorSystem的实例中, 或者换个说法, 从外界看来, ActorSystem 是配置信息的唯一消费者. 在构造一个actor系统时,你可以传进来一个 Config object,如果不传,就相当于传进来 ConfigFactory.load() (使用正确的classloader). 这意味着将会读取classpath根目录下的所有application.conf
, application.json
and application.properties
这些文件—请参阅之前推荐的文档以了解细节. 然后actor系统会合并classpath根目录下的 reference.conf 来组成其内部使用的缺省配置
appConfig.withFallback(ConfigFactory.defaultReference(classLoader))
其中的哲学是代码不包含缺省值,而是依赖于随库提供的 reference.conf 中的配置.
系统属性中覆盖的配置具有最高优先级,见 HOCON 规范 (靠近末尾的位置). 要提醒的是应用配置—缺省为 application—可以使用 config.resource 中的属性来覆盖 (更多细节参阅 配置文档).
注意
如果你编写的是一个Akka应用,把配置放在classpath根目录下的 application.conf 中. 如果你编写的是一个基于Akka的库,把配置放在jar包根目录下的 reference.conf 中.
When using JarJar, OneJar, Assembly or any jar-bundler
警告
Akka会读取所有jar包的reference.conf配置,所以如果你把多个jar包合并成一个jar,那么你也必须合并这些reference.conf,否则默认配置会丢失,导致Akka不能正常工作
Custom application.conf
一个application.conf
可能看起来是这样:
# 你可以在这个配置文件中覆盖掉reference files的配置.
# Copy in parts of the reference files and modify as you please.
akka {
# Loggers to register at boot time (akka.event.Logging$DefaultLogger logs
# to STDOUT)
loggers = ["akka.event.slf4j.Slf4jLogger"]
# 日志级别
# as they have been started; before that, see "stdout-loglevel"
# Options: OFF, ERROR, WARNING, INFO, DEBUG
loglevel = "DEBUG"
# Log level for the very basic logger activated during ActorSystem startup.
# This logger prints the log messages to stdout (System.out).
# Options: OFF, ERROR, WARNING, INFO, DEBUG
stdout-loglevel = "DEBUG"
actor {
provider = "akka.cluster.ClusterActorRefProvider"
default-dispatcher {
# Throughput for default Dispatcher, set to 1 for as fair as possible
throughput = 10
}
}
remote {
# The port clients should connect to. Default is 2552.
netty.tcp.port = 4711
}
}
包含文件
可以将配置include进来。比如有一个通用的环境配置application.conf
,我们只需要覆盖掉其中的个别变量,以满足特殊环境的需求
通过-Dconfig.resource=/dev.conf
加载dev.conf
配置文件,这个配置文件会加载application.conf
dev.conf:
include "application"
akka {
loglevel = "DEBUG"
}
更高级的包含和替换机制在 HOCON 规范中有解释.here
配置日志
如果系统属性或配置属性 akka.log-config-on-start 设置为 on, 那么当actor系统启动时整个配置的日志级别为INFO. 这在你不确定使用哪个配置时会有用。
如果有疑问,你也可以在用它们构造一个actor系统之前或之后很方便地了解配置对象的内容:
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_27).
Type in expressions to have them evaluated.
Type :help for more information.
scala> import com.typesafe.config._
import com.typesafe.config._
scala> ConfigFactory.parseString("a.b=12")
res0: com.typesafe.config.Config = Config(SimpleConfigObject({"a" : {"b" : 12}}))
scala> res0.root.render
res1: java.lang.String =
{
# String: 1
"a" : {
# String: 1
"b" : 12
}
}
每一条设置之前的注释给出了原有设置的详情信息 (文件和行号) 以及(e.g. 在参考配置中)可能出现的注释,与参考配置合并并被actor系统解析的设置可以这样显示:
final ActorSystem system = ActorSystem.create();
println(system.settings());
// 这是 system.settings().config().root().render() 的简写