2016-02-13 3 views
1

Я хочу знать, можно ли получить данные из других модулей из модуля. Я использую ejabberd server 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_filter и mod_calculate не связаны так, как если бы вы использовали прямой вызов функции (например, mod_calculate:some_function(...)).

Смежные вопросы