【问题标题】:Ejabberd module with child process带有子进程的 Ejabberd 模块
【发布时间】:2011-12-05 23:14:16
【问题描述】:

我创建了一个将消息记录到 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 存储库中看到的,我更新了代码,它现在可以工作了,哇! 查看 mod_Archive 代码对我有很大帮助,虽然我没有决定升级我的 ejabberd 版本。

我现在遇到了另一个相关的问题。在代码中,您会看到我使用“SET NAMES UTF8”进行了初始查询,以防止消息出现乱码。如果 gen_server 重新连接,这似乎不会再次完成。是否有任何钩子可以在重新连接时调用,以便每次都完成 UTF8 查询?

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

感谢您的帮助, 迈克尔

【问题讨论】:

    标签: concurrency erlang ejabberd


    【解决方案1】:

    在您的源代码中,您只应用了 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 上进行一些配置。此过程在this page on process one 上进行了描述。请注意,完整的步骤是使 mysql 成为 ejabberd 的完整数据库。你可能不想这样,所以你必须跳几步。 希望对您有所帮助。

    【讨论】:

    • 感谢您的回答。使用 gen_server 我会启动数据库连接?我怎样才能获得数据库参考?
    • 编辑答案以包含一些关于 mysql 的信息,希望对您有所帮助
    • 谢谢努诺。关于 erlang_odbc:这里的问题是,我在服务器端使用 Debian 和 apt 的 ejabberd deb。据我所知,deb 没有在其中编译 odbc 支持。你知道如果我自己编译 MySQL 模块,我还能使用 erlang_odbc 模块吗?我从未尝试过,但我认为它不起作用:(
    • 它可能因版本而异,但使用 mysql 的 ejabberd 是从 Ubuntu 11.04 的存储库中安装的,在此之前,我将它安装在另一台具有先前 ubuntu 版本的机器上。只是不记得是哪个。一开始我很难说我需要从源代码编译它,但我试了一下,一切正常。
    【解决方案2】:

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

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

    【讨论】:

    • 关于 Erlang/OTP:我目前正在使用 o'reilly 的 Erlang book 进行此操作。但是,如果我理解正确的话,我还不是很有信心;)关于数据库的自己的方式:请参阅下面的评论
    • 实际上,我们不推荐使用 Debian 包:无论是我们的二进制包还是从源代码构建。
    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    相关资源
    最近更新 更多