Ejabberd外部组件开发

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

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

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

Ejabberd外部组件开发

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

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

Ejabberd外部组件开发

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

Ejabberd外部组件开发

在我的组件中,我要接收客户端发送的请求报文,并读写后台数据库,这些是我业务上需要的,大家完全不必在意。比较重要的是组件名和组件的路由注册。组件名通常是由“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外部组件开发

上一篇:mvn


下一篇:json学习笔记