- 浏览: 28499 次
- 性别:
- 来自: 广州
最新评论
演示gen_event的运行过程:
mod_event_manager.erl:事件管理器:
mod_event_error_msg.erl: 错误日志事件:把错误放入对应的txt用。
mod_event_manager.erl:事件管理器:
mod_event_error_msg.erl: 错误日志事件:把错误放入对应的txt用。
%%%------------------------------------------------------------------- %%% @author zhongwencool@gmail.com %%% @copyright (C) 2014, <COMPANY> %%% @doc event manager center %%% %%% @end %%%------------------------------------------------------------------- -module(mod_event_manager). -author("zhongwencool@gmail.com"). %% API -export([start/0,start_link/0,stop/0,add_handler/2,add_sup_handler/2,del_handler/2]). -export([notify_error_msg/1,sync_notify_error_msg/0,call_open_file/0,call_close_file/0,which_handlers/0]). -define(SERVER, ?MODULE). %% @doc Creates a stand-alone event manager process, %% i.e. an event manager which is not part of a supervision tree and thus has no supervisor. start() -> gen_event:start({local,?SERVER}). %% @doc Creates an event manager process as part of a supervision tree %% @spec start_link() -> {ok, Pid} | {error, {alread_started,Pid}} start_link() -> gen_event:start_link({local,?SERVER}). stop() -> gen_event:stop(?SERVER). %% @doc Adds a new event handler to the event manager %%The event manager will call Module(Handler):init/1 to terminate the event handler. -spec add_handler(Handler,Args) -> ok | {'EXIT',Reason} | term() when Handler::Module | {Module,Id}, Args::term(), Module::atom(), Id::term(), Reason::term(). add_handler(Handler,Args) -> gen_event:add_handler(?SERVER,Handler,Args). %% @doc Adds a new event handler in the same way as add_handler/3 %% but will also supervise the connection between the event handler and the calling process. add_sup_handler(Handler,Args) -> gen_event:add_sup_handler(?SERVER,Handler,Args). %% @doc Deletes an event handler from the event manager:?MODULE %% The event manager will call Module(Handler):terminate/2 to terminate the event handler. -spec del_handler(Handler,Args) -> term() | {'EXIT',Reason} | {error,module_not_found} when Handler::Module | {Module,Id}, Args::term(), Module::atom(), Id::term(), Reason::term(). del_handler(Handler,Args) -> gen_event:delete_handler(?SERVER,Handler,Args). %% @doc 异步写入错误信息 notify_error_msg(Msg) -> gen_event:notify(?SERVER,{update_error_msg,Msg}). %% @doc 得到文件所有错误日志 sync_notify_error_msg() -> gen_event:sync_notify(?SERVER,{file_content}). %% @doc 重新找开储存错误文件:call要指定模块处理 %% 默认timeout 为5000ms call_open_file() -> gen_event:call(?SERVER,mod_event_error_msg,{open}). call_close_file() -> gen_event:call(?SERVER,mod_event_error_msg,{close},10000). %% @doc Returns a list of all event handlers installed in the event manager which_handlers() -> gen_event:which_handlers(?SERVER).
%%%------------------------------------------------------------------- %%% @author zhongwencool@gmail.com %%% @copyright (C) 2014, <COMPANY> %%% @doc line event %%% %%% @end %%% Created : 20. 二月 2014 下午2:30 %%%------------------------------------------------------------------- -module(mod_event_error_msg). -author("zhongwencool@gamil.com"). -behaviour(gen_event). %% API %% gen_event callbacks -export([init/1, handle_event/2, handle_call/2, handle_info/2, terminate/2, code_change/3]). -define(SERVER, ?MODULE). -record(state, {file_id ,file_name = "error_msg.txt"}). %%%=================================================================== %%% gen_event callbacks %%%=================================================================== %%-------------------------------------------------------------------- %% @private %% @doc %% Whenever a new event handler is added to an event manager, %% this function is called to initialize the event handler. %% %% @end %%-------------------------------------------------------------------- -spec(init(InitArgs :: term()) -> {ok, State :: #state{}} | {ok, State :: #state{}, hibernate} | {error, Reason :: term()}). init(FileName) -> process_flag(trap_exit, true), io:format("mod_event_error_msg: init:"), {ok, Fd} = file:open(FileName, [read, write]), {ok, #state{file_id = Fd,file_name = FileName}}. %%-------------------------------------------------------------------- %% @private %% @doc %% Whenever an event manager receives an event sent using %% gen_event:notify/2 or gen_event:sync_notify/2, this function is %% called for each installed event handler to handle the event. %% %% @end %%-------------------------------------------------------------------- -spec(handle_event(Event :: term(), State :: #state{}) -> {ok, NewState :: #state{}} | {ok, NewState :: #state{}, hibernate} | {swap_handler, Args1 :: term(), NewState :: #state{}, Handler2 :: (atom() | {atom(), Id :: term()}), Args2 :: term()} | remove_handler). handle_event(Event, State) -> NewState = do_handle_event(Event,State), {ok, NewState}. %%-------------------------------------------------------------------- %% @private %% @doc %% Whenever an event manager receives a request sent using %% gen_event:call/3,4, this function is called for the specified %% event handler to handle the request. %% %% @end %%-------------------------------------------------------------------- -spec(handle_call(Request :: term(), State :: #state{}) -> {ok, Reply :: term(), NewState :: #state{}} | {ok, Reply :: term(), NewState :: #state{}, hibernate} | {swap_handler, Reply :: term(), Args1 :: term(), NewState :: #state{}, Handler2 :: (atom() | {atom(), Id :: term()}), Args2 :: term()} | {remove_handler, Reply :: term()}). handle_call(Request, State) -> Reply = ok, NewState = do_handle_call(Request,State), {ok, Reply, NewState}. %%-------------------------------------------------------------------- %% @private %% @doc %% This function is called for each installed event handler when %% an event manager receives any other message than an event or a %% synchronous request (or a system message). %% %% @end %%-------------------------------------------------------------------- -spec(handle_info(Info :: term(), State :: #state{}) -> {ok, NewState :: #state{}} | {ok, NewState :: #state{}, hibernate} | {swap_handler, Args1 :: term(), NewState :: #state{}, Handler2 :: (atom() | {atom(), Id :: term()}), Args2 :: term()} | remove_handler). handle_info(_Info, State) -> {ok, State}. %%-------------------------------------------------------------------- %% @private %% @doc %% Whenever an event handler is deleted from an event manager, this %% function is called. It should be the opposite of Module:init/1 and %% do any necessary cleaning up. %% %% @spec terminate(Reason, State) -> void() %% @end %%-------------------------------------------------------------------- -spec(terminate(Args :: (term() | {stop, Reason :: term()} | stop | remove_handler | {error, {'EXIT', Reason :: term()}} | {error, term()}), State :: term()) -> term()). terminate(_Arg, _State) -> io:format("mod_event_line terminate:~p:::State:~p~n",[_Arg,_State]), ok. %%-------------------------------------------------------------------- %% @private %% @doc %% Convert process state when code is changed %% %% @end %%-------------------------------------------------------------------- -spec(code_change(OldVsn :: term() | {down, term()}, State :: #state{}, Extra :: term()) -> {ok, NewState :: #state{}}). code_change(_OldVsn, State, _Extra) -> {ok, State}. %%%=================================================================== %%% Internal functions %%%=================================================================== do_handle_event({update_error_msg,Msg},#state{file_id=Fd} = State) -> io:format(Fd,"~p~n",[Msg]), io:format("success write msg to file:~p",[Msg]), State; do_handle_event({file_content},#state{file_id=_Fd,file_name = FileName} = State) -> case file:read_file(FileName) of {ok,ErrorMsg} -> io:format("file_content:~p~n",[ErrorMsg]); {error,Reason} -> io:format("file consult error:~p~n",[Reason]) end, State; do_handle_event(Msg,#state{file_id=_Fd} = State) -> io:format("mod_event_error_msg:cannot handler_event this msg :~p",[Msg]), State. do_handle_call({open},State = #state{file_id=0,file_name = FileName}) -> {ok, NewFd} = file:open(FileName, [append,write]), io:format("open file :~p success~n",[FileName]), State#state{file_id=NewFd}; do_handle_call({open},State = #state{file_name = FileName}) -> io:format("file :~p already opened~n",[FileName]), State; do_handle_call({close},State = #state{file_id = Fd}) -> file:close(Fd), State#state{file_id = 0}; do_handle_call(Msg,State) -> io:format("mod_event_error_msg:cannot handler_call this msg :~p",[Msg]), State.
发表评论
-
Erlang 简单的节点互连
2014-03-19 23:41 552自己写的游戏跨服初步构架,以后再一点点完善,先记下时间线哈。 ... -
简单erlang节点互连实验
2014-03-10 15:53 761如果erlang:节点test1,test2互连接: 1.节点 ... -
Erlang OTP gen_event (0)
2014-02-26 14:30 1191原英文文档:http://www.erlang.org/erl ... -
erlang efficient guide 3
2013-08-19 22:19 1111* 3 Common Caveats * 3常见 ... -
erlang efficient guide 2
2013-08-18 01:02 8632 The Eight Myths of Erlang Per ... -
fun还是如以前一样狂跩吊么?
2013-08-16 22:26 611fun这么好用。为什么老大在最近都说不要用? gen:cal ... -
emacs 的erlang-flymake
2013-08-14 15:15 1462emacs 设置erlang-flymake erlang- ... -
erlang ets
2013-07-22 23:08 1858参见:http://www.cnblogs.com ... -
erlang的编程规范
2013-03-26 17:17 1945Programming Rules and Conventio ... -
Erlang------Mnesia
2013-03-25 12:49 1704读erlang编程指南Mnesia笔记: 1.mnesia 是 ... -
进程环
2013-03-18 16:48 818编写一个程序,它生成N ... -
匿名函数fun
2012-12-15 16:12 812lists:map(fun/1,[1,2,3]). 小试匿名函 ... -
并发编程实战otp--open telecom platform 二
2012-10-10 23:17 1148第二章:Erlang语言精要。 shell 的启动参数h ... -
并发编程实战otp--open telecom platform 一
2012-10-10 23:16 12131.erlang 的进程模型: 并发的基本单位是进程, ... -
learn some erlang
2012-10-09 22:54 717Erlang has this very pragm ... -
erlang语句块的简洁使用
2012-09-25 22:48 677begin end语句块的简洁使用:问题描述:将一堆人 ... -
命令式编程语言的标杆
2012-09-25 09:47 685命令式编程语言的标杆: 1.进程必须是语言的核心; 2.任何进 ... -
emacs与erlang的完美结合
2012-09-23 22:48 12861.在emacs中使用c+x c+z 启动erlang she ...
相关推荐
7. **行为模块**:如gen_server、gen_event、gen_fsm等,是OTP设计模式的具体实现,简化了编写服务器、事件处理器和有限状态机的代码。 关于压缩包内的"otp_src_17.3",这是Erlang OTP 17.3版本的源代码目录。为了...
Erlang OTP设计原理是一份深入探讨Erlang/OTP(Open Telecom Platform)框架中设计模式和组织代码原则的文档。Erlang OTP作为Erlang语言的中间件平台,提供了构建可扩展和容错系统的标准方法。 文档开篇就介绍了...
Erlang OTP设计原则中的Gen_Fsm行为是一个关键的概念,用于构建健壮、可扩展的并发应用程序。Gen_Fsm,即通用有限状态机,是一种行为模式,它提供了一种结构化的方法来处理具有多种状态和事件的系统。本文将深入探讨...
1. 监督树(Supervision Trees):监督树是Erlang/OTP的核心概念之一,它是一种分层的组织结构,用于管理进程的生命周期。在这个结构中,有两类主要的进程类型:工作者进程(Worker Processes)和监督进程...
2. OTP框架:理解其模块化设计、行为(gen_server, gen_event等)、分布式应用和系统监控。 3. RabbitMQ基本概念:掌握消息队列的工作原理、交换器(exchanges)、队列(queues)、绑定(bindings)以及消费者...
OTP是Erlang生态系统的重要组成部分,提供了许多预先设计好的行为模式(如 gen_server、gen_event 和 supervisor),这些模式使得开发者能够快速构建出符合Erlang并发哲学的应用程序。 otp_src_21.3.tar是Erlang ...
1. **模块化设计**:OTP提供了各种预定义的进程行为模式(gen_server、gen_event、gen_fsm等),便于开发者创建符合特定模式的进程,提高了代码复用和可维护性。 2. **分布式计算**:Erlang OTP支持跨节点的进程...
这些库包括Mnesia(分布式数据库)、Event Logger、公共接口定义语言(CIDL)以及行为模式如GenServer、GenEvent和Gen_fsm等。这些行为模式为开发者提供了构建状态管理、事件处理和分布式服务的标准结构,使得代码...
Erlang OTP(Open Telephony Platform)是Erlang编程语言的一个核心部分,它提供了一套强大的工具和库,用于构建可靠、可扩展和容错的分布式系统。OTP设计原则着重于实现高度并发、容错性和高效能。下面将详细讨论...
2. **gen_server行为**:gen_server是Erlang OTP中最常用的行为模式,它提供了一个通用服务器模板,支持请求-响应模型。通过gen_server,你可以创建状态管理服务器,处理同步和异步调用,同时支持定时任务和错误处理...
OTP提供了几个设计良好的应用框架,如gen_server、gen_event、gen_fsm等,它们是基于行为模式的模块,简化了并发编程和状态管理。 5. **分布式功能** OTP支持跨节点的分布式计算,使得在多台机器上构建分布式系统...
5. **行为模式(Behaviours)**:如`gen_server`、`gen_event`和`supervisor`等,这些是Erlang OTP设计模式的实现,它们为特定的系统角色提供了基础架构。例如,`gen_server`适用于处理服务请求,`gen_event`用于...
8. **行为(Behaviours)**: Erlang的行为如gen_server、gen_event和gen_fsm,提供了标准的服务器、事件管理和有限状态机的实现框架。源码中可能会有这些行为的实例。 9. **并发与分布式(Concurrency and ...
通过本案例的学习,我们不仅了解了如何使用Erlang构建高性能的在线IP查询服务,而且还深入学习了OTP的关键行为如gen_server、gen_fsm和gen_event的具体应用。这种实践不仅有助于初学者快速掌握Erlang的核心概念,还...
文档版本为v0.1.5,由Erlang/OTP官方撰写,中文版由DinoWu翻译。文档主要分为两大部分:入门指南和OTP设计原则。 ##### 1. 入门指南 - **简介**:简要介绍了Erlang的基本概念,旨在引导新手快速入门。 - **介绍**...
- **行为(Behaviours)**:如gen_server、gen_event和gen_fsm等,定义了标准的服务器、事件管理和有限状态机的行为模式,为编写可靠服务提供模板。 - **应用(Applications)**:Erlang程序组织成应用,每个应用有...
OTP库提供了许多实用的模块,如gen_server、gen_event和gen_fsm,这些都是Erlang并发编程的基础。 总而言之,Erlang9.rar是一个包含Erlang/OTP 20.0 Windows 64位安装程序的压缩包,主要用于安装Erlang环境,以...
1. **gen_server行为模块**:Timekeeper可能实现了一个gen_server行为,这是一个标准的Erlang OTP服务器模板,用于处理客户端的请求并保持内部状态。gen_server提供了一种结构化的方式来处理异步请求,更新状态,并...
- **启动EventManager**:使用`gen_event:start/1`启动。 - **添加事件处理器**:使用`gen_event:add_handler/3`函数添加。 - **通知事件**:通过`gen_event:notify/2`通知事件。 - **删除事件处理器**:使用`gen_...