erlang学习笔记之用OTP构建系统2

1.警报管理


应用程序只需要一个警报,这个警报会在CPU因为计算超大质数而开始熔化时抛
出)。这个警报处理器是OTPgen_event行为的回调模块

-module(my_alarm_handler).
-behaviour(gen_event).

%% gen_event回调函数
-export([init/1, code_change/3, handle_event/2, handle_call/2, handle_info/2, terminate/2]).

%% init(Args) 必须返回 {ok, State}
init(Args) ->
  io:format("*** my_alarm_handler init:~p~n", [Args]),
  {ok, 0}.

handle_event({set_alarm, tooHot}, N) ->
  error_logger:error_msg("*** Tell the Engineer to turn on the fan~n"),
  {ok, N + 1};
handle_event({clear_alarm, tooHot}, N) ->
  error_logger:error_msg("*** Danger over. Turn off the fan~n"),
  {ok, N};
handle_event(Event, N) ->
  io:format("*** unmatched event:~p~n", [Event]),
  {ok, N}.

handle_call(_Request, N) ->
  Reply = N, {ok, Reply, N}.
handle_info(_Info, N) ->
  {ok, N}.

terminate(_Reason, _N) ->
  ok.
code_change(_OldVsn, State, _Extra) ->
  {ok, State}.

 

这段代码非常像gen_server回调代码。
handle_event(Event, State)应当返回{ok, NewState}。
Event是一个{EventType, Event-Arg}形式的元组,其中EventType是set_event或clear_event,而EventArg是一个用户提供的参数。

测试,启动系统,生成一个警报,安装警报处理器,再生成一个警报

 1.用-boot start_sasl启动了Erlang。这么做就得到了一个标准警报处理器。
2.设置警报后只得到了一个信息报告。这个警报没有得到特别处理.
3.安装了一个自定义警报处理器。my_alarm_handler的参数(xyz)没什么特殊
含义,只不过语法要求这里有一个值。但因为我们没有用值而是用了原子xyz,所以能在参数打
印出来时识别它。
4.设置并清除了一个tooHot警报。自定义警报处理器对其进行了处理,shell
打印输出能证明这一点。

2.应用程序服务器

2.1质数服务器
-module(prime_server).
-behaviour(gen_server).

-export([new_prime/1, start_link/0]).

-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
  terminate/2, code_change/3]).

start_link() ->
  gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

new_prime(N) ->
  gen_server:call(?MODULE, {prime, N}, 20000).

init([]) ->
  process_flag(trap_exit, true),
  io:format("~p starting~n", [?MODULE]),
  {ok, 0}.

handle_call({prime, K}, _From, N) ->
  {reply, make_new_prime(K), N + 1}.

handle_cast(_Msg, N) ->
  {noreply, N}.

handle_info(_Info, N) ->
  {noreply, N}.

terminate(_Reason, _N) ->
  io:format("~p stopping~n", [?MODULE]),
  ok.

code_change(_OldVsn, N, _Extra) ->
  {ok, N}.

make_new_prime(K) ->
  if
    K > 100 ->
      alarm_handler:set_alarm(tooHot),
      N = lib_primes:make_prime(K),
      alarm_handler:clear_alarm(tooHot),
      N;
    true ->
      lib_primes:make_prime(K)
  end.
2.2面积服务器
-module(area_server).
-behaviour(gen_server).

-export([area/1, start_link/0]).

-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
  terminate/2, code_change/3]).

start_link() ->
  gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

area(Thing) ->
  gen_server:call(?MODULE, {area, Thing}).

init([]) ->
  process_flag(trap_exit, true),
  io:format("~p starting~n", [?MODULE]),
  {ok, 0}.

handle_call({area, Thing}, _From, N) ->
  {reply, compute_area(Thing), N + 1}.

handle_cast(_Msg, N) ->
  {noreply, N}.

handle_info(_Info, N) ->
  {noreply, N}.

terminate(_Reason, _N) ->
  io:format("~p stopping~n", [?MODULE]),
  ok.

code_change(_OldVsn, N, _Extra) -> {ok, N}.

compute_area({square, X}) ->
  X * X;
compute_area({rectongle, X, Y}) ->
  X * Y.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值