繁体   English   中英

带有子进程的Ejabberd模块

[英]Ejabberd module with child process

我创建了一个日志记录模块,将消息记录到mysql数据库,当前代码位于此处: https : //github.com/amiadogroup/mod_log_chat_mysql5/blob/master/src/mod_log_chat_mysql5.erl

当前代码的问题是,有时连接会关闭,结果该模块不再起作用。 如您在代码中所看到的,我将DBRef存储在一个ets表中,这并不是真正的好方法。

我询问了erlang邮件列表,他们建议我将DB Connection作为模块的子进程进行。 这将使模块能够在关闭连接后正常重启连接。

现在我的问题是:如何使用gen_server和/或gen_mod实现此子进程?

我需要创建两个文件还是可以在同一文件中创建?

关于如何实现该目标,是否有任何示例?

编辑:正如您在链接的github存储库中看到的那样,我更新了代码,现在可以正常运行了,weeha! 查看mod_Archive代码对我有很大帮助,尽管我没有决定升级ejabberd版本。

我遇到了另一个但相关的问题。 在代码中,您看到我使用“ SET NAMES UTF8”进行了初始查询,以防止消息被盗用。 如果gen_server进行重新连接,则似乎不会再次执行此操作。 重新连接时是否可以调用任何挂钩,以便每次都执行UTF8查询?

编辑#2:现在我切换到Emysql(https://github.com/Eonblast/Emysql),通过直接在连接上指定编码,它可以直接使用。 代码在github上。

谢谢您的帮助,迈克尔

我建议您研究Erlang / OTP的一般原则(gen_server,supervisor等)。 ejabberd依赖于这种标准的Erlang架构模式。

关于您对数据库的评论,ejabberd在管理数据库以及将查询传递给MySQL方面有其自己的方式。 您也应该调查一下。

在源代码中,您仅应用gen_mod行为,如果您希望拥有gen_server,则可以在同一模块中进行操作,如果您定义gen_server行为良好。

一个很好的例子是ejabberd模块mod_archive ,它实现了两种行为。


编辑:我从来没有真正在erlang上与mysql进行“直接”合作。 但是通过ejabberd方法,我发现它非常“容易”(您将不得不进行一些设置,但相当容易)。 你有方法

ejabberd_odbc:sql_query_t(Query)

并有一个示例,您可以在模块mod_archive_odbc上找到它。

要使用该方法(以及最后一个模块),我已经下载了mysql本机驱动程序,并将从驱动程序创建的光束放置在ejabberd ebin目录中(您可以将其放置在erlang路径上很长的任何位置)。 我最喜欢ejabberd ebin的软链接:

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

并在ejabberd.cfg上进行一些配置。 此过程在此页面上的过程1中进行了描述。 注意,完整的步骤是使mysql成为ejabberd的完整数据库。 您可能不希望这样,所以您必须跳过一些步骤。 希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM