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登峰造极

    javascipt被称作前端的灵魂,没法灵活运用它,你的前端就只是一具行死走肉.大多初学者能顺利度过div+css,然后倒在了js怀抱,即时跨过了这一关,也只是会用,其底层原理一概不知.小编这就带大家 ...

  2. ORACLE执行详解

    本文源自TTT BLOG,原文地址:http://blog.chinaunix.net/u3/107265/showart_2192657.html 简介:     本文全面详细介绍oracle执行计 ...

  3. JDBC查询数据库中的数据

    只用JDBC技术查询表中的全部内容时,需要使用查询全部的SQL语句,把查询结果放到List集合中. package qddx.JDBC; import java.util.*; import java ...

  4. ie浏览器 jsp中链接参数为中文的处理

    在js中,使用 encodeURIComponent(encodeURIComponent("警情抽查"))来处理参数,例如: mini.get("khxmdm" ...

  5. pyspider 简单应用之快速问医生药品抓取(一)

    网址:http://yp.120ask.com/search/-0-0--0-0-0-0.html from pyspider.libs.base_handler import * class Han ...

  6. linux下c语言实现搜索根目录下所有文件(转-wangxiangshang)

    头文件: #include<dirent.h> #include<sys/types.h> opendir(): 函数原型: DIR * opendir(const char* ...

  7. LeetCode() Largest Number

    全排列,超时,知道超时,只是想验证一下. class Solution { public: string largestNumber(vector<int>& nums) { so ...

  8. 查询expression的小工具

    今天在研究flipsolve的时候无意间写了个shelf tool,用于查询一大推节点中某些parameter的expression中是否存在我需要的关键字.就是简单的对所框选的节点进行一个循序查询参 ...

  9. SDK Manager 中 没有 Support Library怎么弄?

    SDK Manager 中 没有 Support Library怎么弄?求大神帮忙 百度上面说的基本都试了,依旧没有弄出来 点击"Packages" > "Show ...

  10. HA简介以及HBase简介

    HBase基础知识: 一,HMater节点:可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行 1,为Region server 分配r ...