2016-02-13 97 views
1

我想知道是否有可能從模塊中獲取其他模塊的數據。我使用ejabberd服務器15.10,我使用Erlang實現了模塊。ejabberd模塊間通信

這裏的情況:

  • 我有一個過濾消息的模塊:mod_filter
  • 我有另一個模塊,使得一些計算的服務器運行時:mod_calculate

是否有可能每次都從mod_calculate得到新鮮的數據ejabberd服務器過濾器消息mod_filter

回答

0

數據沒有被存儲在模塊但在變量。而且你無法訪問一個模塊中代碼運行的內部變量,而沒有那個模塊以某種方式將這些變量導出到外部世界。

模塊可能已經銷往一些功能。請與:

rp(mod_calculate:module_info()). 

這將顯示模塊中導出的所有功能。其中一些功能可能會將變量從模塊暴露給其他模塊。如果沒有,那麼你需要添加這樣的功能,並從mod_filter調用它們。

+0

非常感謝您的回答! – Jack

+0

不客氣! :-) – Amiramix

0

什麼@Amiramix聲明是準確的,但它不是全貌。

有一個低耦合機制ejabberd通訊模塊之間的事件 - 這是hooks and handlers概念。鏈接指向MongooseIM文檔,但這種機制在兩個代碼庫中都差不多。

一般來說,一個模塊可以調用,這是一樣的函數調用,但根據註冊處理程序可能或可能不導致一些動作(一個或多個)被執行。其他模塊可以註冊處理程序的鉤子,他們選擇。如果您正在編寫相關模塊,則這是一種可能爲您提供所需通信渠道的機制。

爲了使事情更具體 - 每次mod_filter需要一些信息,只有mod_calculate有權訪問,它可以運行ejabberd_hooks:run_fold/4與自定義掛鉤名稱。如果mod_calculate註冊該掛鉤的處理程序(通常在其start函數中),它可以返回一些與mod_filter相關的數據。然而,不同的模塊可以實現對鉤的處理程序,所以mod_filtermod_calculate不耦合,因爲他們是,如果你使用了直接函數調用(如mod_calculate:some_function(...))。