Ejabberd外部组件开发

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启动组件

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




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值