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. 【转】构建C1000K的服务器(1) – 基础

    原文来自 ideawu 构建C1000K的服务器(1) – 基础 著名的 C10K 问题提出的时候, 正是 2001 年, 到如今 12 年后的 2013 年, C10K 已经不是问题了, 任何一个普 ...

  2. PP 创建BOM

    转自 http://blog.csdn.net/u012369651/article/details/19190939 一.最终结果预览. 二.创建过程. 使用到的事务码 CS01 创建BOM CS0 ...

  3. PP生产订单创建、下达、报工、收货、投料

    转自http://blog.sina.com.cn/s/blog_69fb8eb60102vpjd.html SAP 物料订单创建.下达.报工.收货与投料(ABAP代码) (2015-06-03 22 ...

  4. 如何通过IP地址添加网络打印机

    以惠普的HP LaserJet 8100 Series PCL6为例. 1.从开始菜单选择“打印机和传真”. 2.鼠标右键“添加打印机”,然后单击“下一步”,选择“连接到这台计算机的本地打印机”,注意 ...

  5. April Fools Day Contest 2014

    April Fools Day Contest 2014 A.C.H三道题目 ============================================================= ...

  6. php session的理解与使用

    session学习参考链接:1.http://www.w3cschool.cn/php_sessions.html:2.http://php.net/manual/zh/book.session.ph ...

  7. Git服务器搭建及配置

    一.部署环境 Server操作系统:CentOS release 6.7 (Final) 内核版本:2.6.32-358.el6.x86_64 git版本:1.9.0,源码下载地址如下 https:/ ...

  8. Java中的接口

    1.接口概念 <1>接口可以理解一种特殊的类,由全局常量和公共的抽象方法所组成 <2>类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不必关心这些类的内部数据,也 ...

  9. (译) Conditional Variational Autoencoders 条件式变换自编码机

    Conditional Variational Autoencoders --- 条件式变换自编码机 Goal of a Variational Autoencoder: 一个 VAE(variati ...

  10. 【转】SSL/TLS协议运行机制的概述

    互联网的通信安全,建立在SSL/TLS协议之上. 本文简要介绍SSL/TLS协议的运行机制.文章的重点是设计思想和运行过程,不涉及具体的实现细节.如果想了解这方面的内容,请参阅RFC文档. 一.作用 ...