当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


erlang monitor_nodes(Flag)用法及代码示例


monitor_nodes(Flag) -> ok | Error
monitor_nodes(Flag, Options) -> ok | Error
类型:
Flag = boolean()
Options = OptionsList | OptionsMap
OptionsList = [ListOption]
ListOption = 
    connection_id | {node_type, NodeType} | nodedown_reason
OptionsMap = 
    #{connection_id => boolean(),
      node_type => NodeType,
      nodedown_reason => boolean()}
NodeType = visible | hidden | all
Error = error | {error, term()}

调用进程订阅或取消订阅节点状态更改消息。当新节点连接时,nodeup 消息将传递到所有订阅进程,而当节点断开连接时,将传递 nodedown 消息。

如果 Flagtrue ,则开始新的订阅。如果 Flagfalse ,则以相同 Options 开始的所有先前订阅都将停止。如果两个选项列表包含相同的选项集,则它们被视为相同。

nodeup /nodedown 消息的传送保证:

  • nodeup 消息在通过新建立的连接传递来自远程节点的任何信号之前传递。

  • nodedown 消息在通过连接来自远程节点的所有信号都已传递后传递。

  • nodeup 消息在 erlang:nodes() 的结果中出现相应节点后传递。

  • nodedown 消息在 erlang:nodes() 结果中相应节点消失后传递。

  • 从 OTP 23.0 开始,由于到同一节点的新连接,将在 nodeup 消息之前传送正在断开的连接的 nodedown 消息。在 OTP 23.0 之前,不能保证一定会出现这种情况。

节点状态更改消息的格式取决于 Options 。如果Options为空列表或调用net_kernel:monitor_nodes/1,则格式如下:

{nodeup, Node} | {nodedown, Node}
  Node = node()

什么时候Options是空映射或空列表,调用者只会订阅可见节点的状态更改消息。也就是说,只有出现在结果中的节点erlang:nodes/0.

如果Options等于空列表以外的任何值,则状态更改消息的格式如下:

{nodeup, Node, Info} | {nodedown, Node, Info}
  Node = node()
  Info = #{Tag => Val} | [{Tag, Val}]

Info 是映射或二元组列表。其内容取决于Options。如果Options是一张Map,那么Info也将是一张Map。如果Options是一个列表,那么Info也将是一个列表。

Options是映射时,当前允许以下关联:


connection_id => boolean()

如果关联的值等于true, Aconnection_id => ConnectionId协会将被纳入InfoMap哪里ConnectionId是建立或断开连接的连接标识符。有关此连接标识符的更多信息,请参阅文档erlang:节点/2.


node_type => NodeType

NodeType 的有效值:


visible

仅订阅可见节点的节点状态更改消息。关联node_type => visible 将包含在Info 映射中。


hidden

仅订阅隐藏节点的节点状态更改消息。关联node_type => hidden 将包含在Info 映射中。


all

订阅可见节点和隐藏节点的节点状态更改消息。关联node_type => visible | hidden 将包含在Info 映射中。

如果不node_type => NodeType协会被纳入Optionsmap,调用者只会订阅可见节点的状态变化消息,但是 node_type => visible协会将被纳入InfoMap。


nodedown_reason => boolean()

如果关联的值等于 true ,则 nodedown_reason => Reason 关联将包含在 nodedown 消息的 Info 映射中。

Reason 可以是任何术语,具体取决于所使用的分发模块或进程,但对于标准 TCP 分发模块,它是以下其中一项:


connection_setup_failed

连接设置失败(发送nodeup消息后)。


no_network

没有可用的网络。


net_kernel_terminated

net_kernel 进程终止。


shutdown

未指定的连接关闭。


connection_closed

连接已关闭。


disconnect

连接已断开(强制从当前节点断开)。


net_tick_timeout

净刻度time-out。


send_net_tick_failed

无法通过连接发送网络时钟信号。


get_status_failed

从保持连接的 Port 检索状态信息失败。

Options是列表时,当前ListOption可以是以下之一:


connection_id

A {connection_id, ConnectionId}元组将被包含在Info其中ConnectionId是建立或断开连接的连接标识符。有关此连接标识符的更多信息,请参阅文档erlang:节点/2.


{node_type, NodeType}

NodeType 的有效值:


visible

仅订阅可见节点的节点状态更改消息。元组{node_type, visible} 将包含在Info 列表中。


hidden

仅订阅隐藏节点的节点状态更改消息。元组{node_type, hidden} 将包含在Info 列表中。


all

订阅可见节点和隐藏节点的节点状态更改消息。元组{node_type, visible | hidden} 将包含在Info 列表中。

如果不{node_type, NodeType}已给出选项。调用者只会订阅可见节点的状态变化消息,但是 {node_type, visible}元组将被包含在Info列表。


nodedown_reason

元组{nodedown_reason, Reason} 将包含在nodedown 消息的Info 列表中。

请参阅文档nodedown_reason => boolean()上述关联有关可能的信息Reason值。

例子:

(a@localhost)1> net_kernel:monitor_nodes(true, #{connection_id=>true, node_type=>all, nodedown_reason=>true}).
ok
(a@localhost)2> flush().
Shell got {nodeup,b@localhost,
                  #{connection_id => 3067552,node_type => visible}}
Shell got {nodeup,c@localhost,
                  #{connection_id => 13892107,node_type => hidden}}
Shell got {nodedown,b@localhost,
                    #{connection_id => 3067552,node_type => visible,
                      nodedown_reason => connection_closed}}
Shell got {nodedown,c@localhost,
                    #{connection_id => 13892107,node_type => hidden,
                      nodedown_reason => net_tick_timeout}}
Shell got {nodeup,b@localhost,
                  #{connection_id => 3067553,node_type => visible}}
ok
(a@localhost)3>

相关用法


注:本文由纯净天空筛选整理自erlang.org大神的英文原创作品 monitor_nodes(Flag) -> ok | Error。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。