Erlang/OTP中将完成特定功能的一组模块组织起来,称之为
application 。(这不是个好名字,因为它与我们约定俗成的application有着不同的含义,例如在JEE这样的开发中,整个应用系统被称为一个application;在iOS中一个独立游戏、一个小工具都被称为一个application。Erlang中的application其实是一种大的功能模块,例如lager这个application为其他模块提供日志功能)
erlang/OTP的application模块(指erlang module)是一种最基本的behavior,是Erlang代码和功能组织的形式(见
Erlang OTP设计原则)
application运行时可能需要提供某些参数,以调整运行时的行为。例如数据库的连接参数(主机名,端口号等),这些参数可以存放在静态配置文件中,application运行时可以通过调用application:get_env(ParamKey)得到当前application配置的参数值。get_env(Foo, Par)得到某个指定application,Foo的配置参数值.
以application lager的配置为例,lager有多个日志级别(debug/info/warning/error),配置不同级别的日志会影响日志的输出,此外日志文件的名字和存放位置也是可以配置的,这些都可以作为lager的运行参数在lager启动时配置。
实际上,application的参数可以在很多地方配置(例如: 在静态配置文件中配置,一般是application的.app文件,甚至在erlang启动时作为启动命令的一部分为某个application配置运行参数),因此搞清这些不同地方进行配置关系(比如配置的缺省位置和如何覆盖override参数)是进行erlang OTP开发的基本功。
每个application的运行参数可视为一种环境参数,这些参数可以在三个层次进行配置,如图所示
上层的配置可以覆盖(override)下层的配置:
Application Resource File, (.app文件)图中最底层(橙色),每个application都要自己的资源文件,这些文件都有统一的格式,其中有个env属性,用于为本application配置环境参数,
详细信息。因为最底层配置的参数总能被上层的参数覆盖,而且资源文件中的参数只限于本application,所以application的缺省参数在此配置最好。
System Configuration File, (.config文件), 图中第二层(绿色),当多个application连同erlang运行时, lib库打包发布时,整个发布包(粉红色虚线框)会有一个sys.config,在sys.config文件中配置可以对特定的application的环境参数进行定制:同名的参数将被覆盖。作为整个发布的配置文件, sys.config可以同时对发布包中的多个application进行参数配置。而且在我们的发布里不一定都叫sys.config这个名字,可以在erl命令的选项-config中
指定其它名字。
最高层(蓝色),直接在erl命令中直接为某个application配置参数,
详细信息,例如如果打算将lager的日志级别设为debug(缺省是info),可以这样:
erl -lager handlers '[{lager_console_backend, debug}]'
如例所示,参数的值可以是比较复杂的erlang term,记得要用引号引起来。
这一级别显然比较适合在application开发、调试时临时调整application参数用。
这些配置参数的值实际上在application启动之前就已生效。比如上述例子中在erl启动时配置了lager的运行参数,但此时lager这个application还没有启动,当用application:start/1 启动lager后,相关的配置参数在此时应用到lager上。
另外,还有一种特殊的application叫做
Library Applications(比如一个复数函数库),这种application有可能只提供一些函数,不会直接有erlang进程生成,所以一般不需要application:start就能使用。Library Applications中的参数也可以在app.src文件中配置,但是不用application:start这些文件中参数是不会自动加载的。
还要注意的一点是:当对系统打包发布(release)时,
只能通过修改System Configuration File(默认名是sys.config的文件)覆盖环境配置参数,发布后再修改发布包中application的app文件是没有效果的。

- 大小: 164 KB
分享到:
相关推荐
在Erlang中,"应用"(application)是组织代码的基本单元,它包含了模块、配置文件以及启动和停止应用程序的逻辑。在这个"Erlang入门:构建application练习5(监督树)"中,我们将探讨如何构建一个包含监督树的应用,...
3. **部署到节点**:将释放包复制到目标Erlang节点的`ebin`目录下,或者使用`release_handler`模块的`add_application/2`或`install_release/1`函数进行远程部署。 4. **启动应用**:调用`application:start/1`或`...
在Erlang OTP(Open Telecom Platform)框架下,`server_app`可能实现了`application`行为,负责应用程序的生命周期管理。它会定义应用的模块、版本、依赖项、以及其他配置参数,同时包含启动和停止应用的函数。 2....
在 `application.properties` 或 `application.yml` 文件中配置 RabbitMQ 相关参数: ```properties rabbitmq: host: 127.0.0.1 port: 5672 username: guest password: guest publisher-confirms: true # 生产...
在`application.properties`或`application.yml`中添加RabbitMQ的配置信息: ```properties spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=...
`Application`模块是Erlang OTP(开放电信平台)的一部分,用于管理和控制Elixir应用的生命周期。 3. **启动过程**: 应用启动时,会调用`Application.start/2`函数。这个函数会读取`mix.exs`中的配置,并按照指定...