参考:
http://anders.conbere.org/journal/

http://www.process-one.net/en/wiki/ejabberd_module_development/

ejabberd的内部的很多模块都是以插件的形式工作,这样我们也可以开发自己的模块融合到ejabberd中去,完成各种各样我们独特的需求。

ejabberd定义了一个gen_mod behaviour,其要求下面的callback:

  1. start(Host, Opts) -> ok
  2. stop(Host) -> ok
  3. * Host = string()
  4. * Opts = [{Name, Value}]
  5. * Name = Value = string()

其中Host是运行这module的一个虚拟的主机。

Opts是在配置中指定的mod的参数(后面会讲到),可以通过gen_mod:get_module_opt/4获取(参看gen_mod.erl代码得知这些信息存储在ets中)。

我们要实现一个mod非常容易,就非常容易了:

  1. -module(my_module).
  2. -author('your@mail.com').
  3. -behaviour(gen_mod).
  4. -include('ejabberd.hrl').
  5. %% gen_mod callback
  6. -export([start/2, stop/1]).
  7. start(_Host, _Opt) -> ok.
  8. stop(_Host) -> ok.

让我们在添加一代码,让我们这个“无用”的mod更加清晰一些

  1. start(_Host, _Opt) ->
  2. ?DEBUG("EXAMPLE MODULE LOADING").

编译my_module,将my_module.beam放到你的ejabberd/ebin目录中:

mv my_module.beam /var/lib/ejabberd/ebin

接着,我们需要对ejabberd.cfg做一些配置,告诉ejabberd加载我们的my_module:

  1. {modules,
  2. [
  3. {mod_register, [{access, register}]},
  4. ...
  5. {my_module, []}  % []为my_module:start/2中的第二个参数
  6. ]}.

好了,一切OK后,重新启动ejabberd,如果你的loglevel设置为5,那么你将看到如下信息:

  1. =INFO REPORT==== 2008-07-17 15:33:27 ===
  2. D(<0.37.0>:ejabberd_auth_my_auth:44) : EXAMPLE MODULE LOADING

我们的ejabberd module顺利加载了。

写到这里,您可能会问,如何实现一个更加强大的module呢?

原来ejabberd为我们提供了很多的API,可以供我们使用,包含如下:

ejabberd core modules (ejabberd核心模块)

ejabberd events and hooks(ejabberd 事件及钩子)

ejabberd IQ handlers

ejabberd route table (ejabberd 路由表)

ejabberd HTTP request handlers(ejabberd HTTP 请求处理)

有了这些API,我们可以实现任何我们想要的功能。

下节实现一个简单http处理模块

引自:http://erlangdisplay.iteye.com/blog/315461#bc2336870

ejabberd模块开发的更多相关文章

  1. AngularJS多模块开发

    angularJS中的多模块开发是指多个module模块开发,步骤为: 1. 确定主模块    var app=angular.module('myApp',[]); 2. 其他的子模块添加到主模块后 ...

  2. js模块开发(一)

    现在嵌入页面里面的javascript代码越来越复杂,于是可能依赖也越来越严重,使用别人开发的js也越来越多,于是在理想情况下,我们只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 于是j ...

  3. seajs实现JavaScript 的 模块开发及按模块加载

    seajs实现了JavaScript 的 模块开发及按模块加载.用来解决繁琐的js命名冲突,文件依赖等问题,其主要目的是令JavaScript开发模块化并可以轻松愉悦进行加载. 官方文档:http:/ ...

  4. Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”

    整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...

  5. 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--模块开发

    之前文章中给大家说明了下我这个小小的想法,发现还是有不少人的支持和关注.你们的鼓励是对我最大的支持. 我总结了了大家的评论,有以下几个问题: 1.希望有更多的文档说明. 2.希望介绍下Orchard的 ...

  6. js 模块开发之一(模块开发价值)

    首先引用我们的今天的主角 ----<前端模块化开发的价值> 1,前端开发最常见的两个问题 ---命名冲突和文件依赖 2,对于命名冲突的基本解决办法就是学习其他语言的习惯,添加命名空间 va ...

  7. nginx模块开发篇 (阿里著作)

    背景介绍 nginx历史 使用简介 nginx特点介绍 nginx平台初探(100%) 初探nginx架构(100%) nginx基础概念(100%) connection request 基本数据结 ...

  8. Drupal8开发教程:模块开发——创建新页面

    之前我们已经通过<Drupal8开发教程:认识.info.yml文件>对模块的YAML文件有了了解,今天我们来看如何通过模块开发的方式添加一个新的页面. 在 Drupal 7 中,通过模块 ...

  9. SpringMvc+jquery easyui模块开发7步骤

    搞了一段java的开发,总结出模块开发经验: SpringMvc+jquery easyui模块开发7步骤:1) 数据表(table):                定义表结构并创建数据表t_use ...

随机推荐

  1. CodeForces 711B Chris and Magic Square

    简单题. 找一个不存在$0$的行,计算这行的和(记为$sum$),然后就可以知道$0$那个位置应该填的数字(记为$x$). 如果$x<=0$,那么无解,否则再去判断每一行,每一列以及两个斜对角的 ...

  2. .Net 生成二维码【超简易,仅供学习】

    1,首先下载DotNetBarcode.dll文件 下载地址: http://dl.downyi.com/dotnetbarcode_dll.rar 2,调用方式 string path = @&qu ...

  3. [SQL基础教程] 3-2 对表进行分组

    [SQL基础教程] 3-2 对表进行分组 GROUP BY SELECT <列名1>,<列名2>,... FROM <表名> GROUP BY <列名1> ...

  4. [SQL基础教程] 2-1 SELECT语句基础

    [SQL基础教程] 2-1 SELECT语句基础 列的查询 Syntax SELECT<列名>,..... FROM<表名>; SELECT col_1, col_2 FROM ...

  5. [Q]将图纸转换为JPG、PNG、plt、DWF、DWFx,XPS等格式文件

    如要将图纸打印为图片,请选择“PublishToWeb JPG.pc3”或“PublishToWeb PNG.pc3”打印机. 如要将图纸打印为plt格式文件,请选择“Windows Default ...

  6. Vrui 增加自定义事件

    #include <Vrui/Application.h> #include <GL/GLObject.h> #include <Vrui/Vrui.h> #inc ...

  7. linux kernel module

    #include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h> static i ...

  8. ubuntu 安装Matlab 解决显示中文乱码

    在ubuntu 14.04中安装Matlab 2015a打开后发现中文乱码,这主要是由于JAVA中文支持问题.   解决方法如下: 进入Maltab的安装路径: 进入JRE目录: cd Matlab目 ...

  9. 修改LibreOffice Draw中定义的样式名称

    目前我使用的是LibreOffice 4.2.4.2.经过以往的测试和使用经验,这是诸多版本中较为稳定和bug相对较少的.今天无意中发现该版本的LibreOffice Draw存在一个问题:样式名称修 ...

  10. reids配置参数详解

    转自:http://www.jb51.net/article/60627.htm reids配置参数详解 #daemonize no  默认情况下, redis 不是在后台运行的,如果需要在后台运行, ...