當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。