Ejabberd的基本介绍就不多言了,使用erlang开发的高并发高稳定性XMPP服务器,在whatsapp中得到了应用,算是erlang领域一个杀手级应用。前面的文章中我已经总结了Ejabberd插件的开发方法,并演示了如何在插件中捕获和处理IQ。然而有时候,用户可能不想搭建一个完整的XMPP服务器,而只是想单独运行一个类似服务器插件的程序,用于处理特定的报文,这种程序我们叫做外部组件。外部组件由自己独立的域名,并且和XMPP服务器连接,所有发送至该域名的报文,XMPP服务器都会直接投送过来。

Ejabberd插件是可以当做外部组件来运行的,前提是这个插件只使用到了Ejabberd路由表,即Ejabberd_route_table。

好,我们先来编写组件。首先,不管是ejabberd的内部插件还是外部组件,都必须使用gen_mod模式。对外部组件来说,同时必须实现gen_server模式,这样的话,我们的程序开头是这个样子的:

本文中使用的Ejabberd版本是2.0.3,这个版本中是没有logger.hrl这个头文件的。可能有的同学会说现在Ejabberd都出到14.12版本了,为啥还用老掉牙的2.0.3呢?哎,这实在是无奈之举,后面会给大家个无法拒绝的解释。

接下来看看下面这三个函数:

Start_link函数用于在本机启动gen_server服务进程,start和stop是mod中必须导出的两个函数。和之前的插件不同,在外部组件的start函数中,监督者会将组件的gen_server进程纳入监督树。接下来,我们看看,在gen_server的init过程中,组件干了些啥。

在我的组件中,我要接收客户端发送的请求报文,并读写后台数据库,这些是我业务上需要的,大家完全不必在意。比较重要的是组件名和组件的路由注册。组件名通常是由“name.host”组成的,name随便取,host一般取本机域名,组件域名设置好一会调用ejabberd API函数ejabberd_router:register_route把域名注册进路由表就可以了。

到这里,我们的组件基本完成了,但是呢,他现在还不具备任何功能,想处理报文的话,就需要在gen_server的handle_info回调中处理啦。可以参考ejabberd自带的mod_echo模块,我就不多说了,总之就是收到数据后你爱咋处理就咋处理。

组件别写并编译完以后,我们面临两种选择,是让组件以插件的形式在Ejabberd启动的时候便启动呢,还是让组件以单独的程序独立运行呢?如果选择第一种,那么我们需要把编译生成的beam文件拷贝到Ejabberd安装目录下的ebin目录下,并修改配置文件/etc/ejabberd/ejabberd.cfg文件,不同版本,文件名也是有区别的,大家注意下。找到modules的配置位置,加上我们自己的模块:{mod_mymod,[{host, name@host}]},然后重启Ejabberd就OK了。

如果要单独运行组件,我们需要使用一个工具,epeios,这个东西貌似已经不更新了,目前的版本就是1.0.0,而且要求的Erlang版本是R12B-5,里面带的mod_muc是基于ejabberd-2.0.3的,如果版本不一致,编译会出问题,当然,如果你时间充沛,自己改写epeios也是可以的,可惜我的时间不允许啊,只好先将就一下了,后面我一定要把他改掉。

使用epeios的具体配置过程是这样的,先设置EPEIOS_ROOT环境变量,取值就是epeios-1.0.0所在的路径,主要epeios-1.0.0这个目录名,千万不能更改,他内部的工具只认这个(哎,多么的不人性),接下来:

1. 把我们编译好的组件二进制文件beam拷贝到epeios目录下的modules文件夹内

2. 修改sys.config.mk文件,配置我们组件的名称和XMPP服务器的主机名、认证密码、连接端口和模块名等

3. 修改priv/sys.config文件,相关配置内容要与sys.config.mk保持一致

4. ./build.sh

5. priv/epeios.start启动组件

启动成功后,服务端会有提示:

Ejabberd外部组件开发的更多相关文章

  1. COM组件开发实践(八)---多线程ActiveX控件和自动调整ActiveX控件大小(下)

    源代码下载:MyActiveX20081229.rar 声明:本文代码基于CodeProject的文章<A Complete ActiveX Web Control Tutorial>修改 ...

  2. Flex自定义组件开发之日周月日期选择日历控件

    原文:Flex自定义组件开发之日周月日期选择日历控件         使用过DateField的我们都知道,DateField 控件是用于显示日期的文本字段,字段右侧带有日历图标.当用户在控件边框内的 ...

  3. java 组件开发中的日志记录问题

    今天帮别人写封装几个url 请求,打成jar 包,可以以java接口的方式提供给外部访问. 遇到两个问题: 1. 是否把依赖的jar包也 打入 我要生成的jar包中,如果你不打入,别人直接调用接口会报 ...

  4. Flex自定义组件开发 - jackyWHJ

    一般情况下需要组件重写都是由于以下2个原因: 1.在FLEX已有组件无法满足业务需求,或是需要更改其可视化外观等特性时,直接进行继承扩展. 2.为了模块化设计或进一步重用,需要对FLEX组件进行组合. ...

  5. vue前端开发那些事——vue组件开发

    vue的学习曲线不是很陡(相比其它框架,如anglarjs),官方文档比较全面,分为基础篇和高级篇.我们刚开始学习的时候,肯定像引用jquery那样,先把vue的js引进来,然后学习基础内容.如果仅仅 ...

  6. Flex自定义组件开发

    一般情况下需要组件重写都是由于以下2个原因:1.在FLEX已有组件无法满足业务需求,或是需要更改其可视化外观等特性时,直接进行继承扩展.2.为了模块化设计或进一步重用,需要对FLEX组件进行组合.而F ...

  7. vue.js原生组件化开发(一)——组件开发基础

    前言 vue作为一个轻量级前端框架,其核心就是组件化开发.我们一般常用的是用脚手架vue-cli来进行开发和管理,一个个组件即为一个个vue页面,这种叫单文件组件.我们在引用组件之时只需将组件页面引入 ...

  8. amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules

    amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...

  9. [Asp.net core 3.1] 通过一个小组件熟悉Blazor服务端组件开发

    通过一个小组件,熟悉 Blazor 服务端组件开发.github 一.环境搭建 vs2019 16.4, asp.net core 3.1 新建 Blazor 应用,选择 asp.net core 3 ...

随机推荐

  1. javascript设计模式之观察者模式

    观察者模式又称发布/订阅模式   publish/subscribe 它是一种一对多的关系,让多个观察者对象同时监听某一主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得他们能够自动 ...

  2. C#的循环语句练习

    1.输入一个整数,算出从1到这个数每个数阶乘的和. 2.求100以内质数的和. 3.有一对幼兔,幼兔1个月后长成小兔,小兔1个月后长成成兔并生下一对幼兔,问几个月后有多少对兔子,幼兔,小兔,成兔分别是 ...

  3. sql join,left join,rigt join

    left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录.right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录.inner join: 内连接,又叫等 ...

  4. bzoj1188 [HNOI2007]分裂游戏 博弈论 sg函数的应用

    1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 973  Solved: 599[Submit][Status ...

  5. Android学习十一:高德地图使用

    写这篇文章主要有三个目的: 1.使用高德地图api定位 2.获取天气数据 3.编程练手 文件结构 清单文件信息说明: <?xml version="1.0" encoding ...

  6. golang开发环境(2016.9.16)

    一.windows下安装 1.下载go1.7.3.windows-amd64.msi,建议默认安装到‘C:\Go\’ 2.环境变量 变量 值 说明 Path C:\Go\bin 安装程序默认会设置,如 ...

  7. 042. asp.net使用缓存来提高母版页的访问性能

    Asp.Net缓存技术是一项非常重要的技术, 当一个页面被频繁的访问, 如果不使用缓存技术, 那么每访问一次就要回发一次服务器, 显然这样对服务器造成很大的负担, 所以, 可以在被频繁访问的页面中设置 ...

  8. tomcat war部署根目录下

    一个很取巧的办法,步骤如下: 1. 删除webapp下所有文件 cd ${TOMAT_HOME}/webapps && rm -rf * 2. copy待部署war到webapps目录 ...

  9. SQLSERVER 删除用户15434错误

    sysprocesses 表中保存关于运行在 Microsoft® SQL Server™ 上的进程的信息.这些进程可以是客户端进程或系统进程.sysprocesses 只存储在 master 数据库 ...

  10. [转载]jQuery1.9完全删除live事件

    其实关于live被删除的事件早就在1.7.2版本以后就有通知过了 不过在官方一直提倡使用.on代替.live的过程中 .live事件一直沿用 今天更新了 看下jQuery1.9的相关信息 发现api中 ...