Модуль Ejabberd с дочерним процессом - PullRequest
0 голосов
/ 12 октября 2011

Я создал модуль регистрации, который записывает сообщения в базу данных mysql, текущий код находится здесь: https://github.com/amiadogroup/mod_log_chat_mysql5/blob/master/src/mod_log_chat_mysql5.erl

Проблема с текущим кодом заключается в том, что иногда соединение закрывается и в результатемодуль больше не работает.Как вы видите в коде, я храню DBRef в таблице ets, что не очень хороший способ.

Я спросил об этом список рассылки erlang, и они предложили мне подключиться к БД каксобственный дочерний процесс модуля.Это позволило бы модулю корректно перезапустить соединение при закрытии соединения.

Теперь мой вопрос: как я могу реализовать этот дочерний процесс с помощью gen_server и / или gen_mod?

Нужно ли мнесоздать два файла или я могу сделать это в одном файле?

Есть ли где-нибудь пример того, как мне этого добиться?

Редактировать: Как вы можете видетьв связанном репозитории github я обновил код и теперь он работает, крошка!Просмотр кода mod_Archive мне очень помог, хотя я не решил обновить свою версию ejabberd.

Я столкнулся с другой, но связанной с ней проблемой, теперь.В коде вы видите, что я делаю начальный запрос с «SET NAMES UTF8», чтобы предотвратить искажение сообщений.Похоже, это не будет сделано снова, если gen_server выполнит переподключение.Есть ли какой-нибудь хук, который я могу вызвать при переподключении, чтобы запрос UTF8 выполнялся каждый раз?

Edit # 2: Теперь я переключился на Emysql (https://github.com/Eonblast/Emysql), и он работает из коробкиуказав кодировку непосредственно при подключении. Код находится на github.

Спасибо за помощь, Майкл

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

Я предлагаю вам ознакомиться с общими принципами Erlang / OTP (gen_server, supervisor и т. Д.).ejabberd использует этот стандартный шаблон архитектуры Erlang.

Что касается вашего комментария к базе данных, ejabberd по-своему управляет базой данных и передает запросы в MySQL, например.Тебе следует также изучить это.

1 голос
/ 12 октября 2011

В вашем исходном коде вы применяете только поведение gen_mod, если вы хотите иметь gen_server, вы можете сделать это в том же модуле, если вы определите, что поведение gen_server хорошо.

Хорошим примером может служить модуль ejabberd mod_archive , который реализует оба поведения.


Edit: я никогда не работал "напрямую" с mysql на erlang. Но с помощью методов ejabberd я нахожу это довольно «легким» (вам придется сделать несколько настроек, но довольно легко). У вас есть метод

ejabberd_odbc:sql_query_t(Query)

И есть пример, который вы можете найти в модуле mod_archive_odbc .

Чтобы использовать этот метод (и последний модуль), я скачал собственный драйвер mysql и поместил балки, созданные из драйвера, в ejabberd ebin dir (вы можете поместить его где угодно, если он находится на пути erlang). Мягкая ссылка на ejabberd ebin - моя любимая:

ln -s <diryouhavethedriver>/ebin/*.beam /usr/lib/ejabberd/ebin/

и сделайте несколько настроек для вас ejabberd.cfg. Этот процесс описан на этой странице на первом процессе . Обратите внимание, что полные шаги должны сделать mysql полной базой данных ejabberd. Вы можете не хотеть этого, поэтому вы должны прыгнуть на несколько шагов. Надеюсь, что это поможет.

...