【发布时间】:2016-01-12 01:18:41
【问题描述】:
我在 ubuntu 14.04 上使用 ejabberd v2.1.11 版本。编译 exmpp 模块并复制到/usr/lib/ejabberd/ebin/ 位置。以下是“my_module”代码。
-module(my_module).
-author("John").
-include("/home/jk/src/exmpp/include/exmpp.hrl").
-include("/home/jk/src/exmpp/include/exmpp_client.hrl").
-include("ejabberd.hrl").
-export([start/2, stop/1]).
-export([on_filter_packet/1]).
-record(state, {}).
stop(_Host) -> ok.
start(Host, Opts) ->
?INFO_MSG("START MODULE LOADING", []),
ejabberd_hooks:add(filter_packet, global, ?MODULE, on_filter_packet, 0).
% gen_server:start_link(?MODULE, [Host], []).
on_filter_packet({From, To, Packet} = Input) ->
Parser = exmpp_xml:start_parser(), % FAILS HERE
Schedule = exmpp_xml:parse_final(Parser, "<schedule version='1.0' ></schedule>"),
exmpp_xml:stop_parser(Parser),
Input.
当 ejabberd 启动时抛出以下错误
running hook: {filter_packet,[]}
=ERROR REPORT==== 2015-10-13 22:12:24 ===
E(<0.9790.0>:ejabberd_hooks:335) : {badarg,
[{ets,member,
[exmpp_xml_engines_registry,expat],
[]},
{exmpp_xml,is_engine_available,1,
[{file,"./core/exmpp_xml.erl"},
{line,520}]},
{exmpp_xml,get_engine_from_options,1,
[{file,"./core/exmpp_xml.erl"},
{line,4007}]},
{exmpp_xml,start_parser,1,
[{file,"./core/exmpp_xml.erl"},
{line,625}]},
{my_module,on_filter_packet,1,
[{file,"my_module.erl"},{line,52}]},
{ejabberd_hooks,run_fold1,4,
[{file,"ejabberd_hooks.erl"},
{line,331}]},
{ejabberd_router,do_route,3,
[{file,"ejabberd_router.erl"},
{line,315}]},
{ejabberd_router,route,3,
[{file,"ejabberd_router.erl"},
{line,68}]}]}
ejabberd模块中的exmpp模块如何使用?
编辑:
在 start 方法中添加 exmpp:start() 并将 c_src 复制到 ejabberd 库中即可。
cp -rf exmpp/c_src/ /usr/lib/ejabberd/
我认为由于所有 exmpp 依赖项都在其自己的模块中,因此将 exmpp_*.beam 文件复制到 ejabberd 模块可以访问的 /usr/lib/ejabberd/ebin/ 位置就足够了在 ejabberd 模块中使用,但事实并非如此。
虽然上述解决方案有效,但安装 exmpp 模块以便在 ejabberd 模块中使用的正确方法是什么。
【问题讨论】:
-
了解如何构建和发布 erlang/OTP 应用程序