net_kernel:monitor_nodes 订阅node连接\断开消息
2015-06-12 16:33
866 查看
转载:http://www.cnblogs.com/me-sa/archive/2011/07/12/erlang0005.html
Erlang中节点之间建立链接我们可以使用net_adm:ping(),连接成功返回pong,失败返回pang;实践中我们不仅仅是要建立连接,比如我们需要在与其它节点建立连接或者其它节点断开的时候做一些事情,比如在节点当掉的时候记录日志,这就需要在对应的时机取得相应的信息;Erlang在net_kernel库中提供了这样的方法:net_kernel:monitor_nodes(Flag);调用这个方法来订阅节点状态变动的消息.一个节点加入的时候会向所有的订阅进程发送一个nodeup消息,一个节点断开的时候会发送nodedown消息.
看规格说明中,我们可以对订阅的消息进行定制:
doc地址:http://www.erlang.org/doc/man/net_kernel.html#monitor_nodes-1
monitor_nodes(Flag) -> ok | Error
monitor_nodes(Flag, Options) -> ok | Error
Types:
Flag = boolean()
Options = [Option]
Option = {node_type, NodeType} | nodedown_reason
NodeType = visible | hidden | all
Error = error | {error, term()}
一个典型的应用就是rabbitmq项目中rabbit_node_monitor的代码,关于rabbitmq项目请点击这里,解析:
在下面这段代码里面rabbit_node_monitor是一个gen_server,在它启动的回调函数中,调用了 net_kernel:monitor_nodes(true)方法,同时在handle_info中添加了对nodeup和nodedown消息的处理,这段代码里面在和其它节点建立链接的时候(nodeup)记录了日志,在节点当掉的时候(nodedown)做了数据库和网络的清理
工作,相关的代码文件位置: rabbit_networking rabbit_amqqueue
-module(rabbit_node_monitor).
-behaviour(gen_server).
-export([start_link/0]).
-export([init/1, handle_call/3,
handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-define(SERVER, ?MODULE).
%%--------------------------------------------------------------------
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
%%--------------------------------------------------------------------
init([]) ->
ok = net_kernel:monitor_nodes(true),
{ok, no_state}.
handle_call(_Request, _From, State) ->
{noreply, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info({nodeup, Node}, State) ->
rabbit_log:info("node ~p up", [Node]),
{noreply, State};
handle_info({nodedown, Node}, State) ->
rabbit_log:info("node ~p down", [Node]),
%% TODO: This may turn out to be a performance hog when there are
%% lots of nodes. We really only need to execute this code on
%% *one* node, rather than all
of them.
ok = rabbit_networking:on_node_down(Node),
ok = rabbit_amqqueue:on_node_down(Node),
{noreply, State};
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%--------------------------------------------------------------------
成功开源项目中可挖掘的东西真是多,特别是学习一个新东西的时候,需要从广泛涉猎一些开源项目,开阔眼界,积累知识,继续!
Erlang中节点之间建立链接我们可以使用net_adm:ping(),连接成功返回pong,失败返回pang;实践中我们不仅仅是要建立连接,比如我们需要在与其它节点建立连接或者其它节点断开的时候做一些事情,比如在节点当掉的时候记录日志,这就需要在对应的时机取得相应的信息;Erlang在net_kernel库中提供了这样的方法:net_kernel:monitor_nodes(Flag);调用这个方法来订阅节点状态变动的消息.一个节点加入的时候会向所有的订阅进程发送一个nodeup消息,一个节点断开的时候会发送nodedown消息.
看规格说明中,我们可以对订阅的消息进行定制:
doc地址:http://www.erlang.org/doc/man/net_kernel.html#monitor_nodes-1
monitor_nodes(Flag) -> ok | Error
monitor_nodes(Flag, Options) -> ok | Error
Types:
Flag = boolean()
Options = [Option]
Option = {node_type, NodeType} | nodedown_reason
NodeType = visible | hidden | all
Error = error | {error, term()}
一个典型的应用就是rabbitmq项目中rabbit_node_monitor的代码,关于rabbitmq项目请点击这里,解析:
在下面这段代码里面rabbit_node_monitor是一个gen_server,在它启动的回调函数中,调用了 net_kernel:monitor_nodes(true)方法,同时在handle_info中添加了对nodeup和nodedown消息的处理,这段代码里面在和其它节点建立链接的时候(nodeup)记录了日志,在节点当掉的时候(nodedown)做了数据库和网络的清理
工作,相关的代码文件位置: rabbit_networking rabbit_amqqueue
-module(rabbit_node_monitor).
-behaviour(gen_server).
-export([start_link/0]).
-export([init/1, handle_call/3,
handle_cast/2, handle_info/2,
terminate/2, code_change/3]).
-define(SERVER, ?MODULE).
%%--------------------------------------------------------------------
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
%%--------------------------------------------------------------------
init([]) ->
ok = net_kernel:monitor_nodes(true),
{ok, no_state}.
handle_call(_Request, _From, State) ->
{noreply, State}.
handle_cast(_Msg, State) ->
{noreply, State}.
handle_info({nodeup, Node}, State) ->
rabbit_log:info("node ~p up", [Node]),
{noreply, State};
handle_info({nodedown, Node}, State) ->
rabbit_log:info("node ~p down", [Node]),
%% TODO: This may turn out to be a performance hog when there are
%% lots of nodes. We really only need to execute this code on
%% *one* node, rather than all
of them.
ok = rabbit_networking:on_node_down(Node),
ok = rabbit_amqqueue:on_node_down(Node),
{noreply, State};
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%--------------------------------------------------------------------
成功开源项目中可挖掘的东西真是多,特别是学习一个新东西的时候,需要从广泛涉猎一些开源项目,开阔眼界,积累知识,继续!
相关文章推荐
- 详细讲解nodejs中使用socket的私聊的方式
- 【node.js】基础<一>
- nodejs之connect模块
- Node开发这块目前比较理想的装配建议
- 使用node.js express 4.x 模块 搭建angular.js开发环境
- #leetcode#Populating Next Right Pointers in Each Node
- node-webkit实践-一键安装
- Windows下nodejs的安装与简单事例
- 编译contrail-nodemgr
- nodejs 文件与文件操作(读写文件 删除 重命名)
- 收集了NodeJS开发中常用的一些模块。
- Nodejs异步回调的优雅处理方法
- 通过Anuglar Material串串学客户端开发 - NodeJS模块机制之Module.Exports
- [6]_先从前端说起 - Nodejs学习之基础(1)
- 模拟namenode崩溃,使用secondarynamenode恢复
- leetcode 019 Remove Nth Node From End of List (Python)
- HDFS-datanode数据块部分笔记
- remove-nth-node-from-end-of-list
- NodeJS简单的网页跳转路由demo
- Node.js学习笔记-入门