2015-10-14 67 views
1

我在ubuntu 14.04上使用ejabberd版本v2.1.11。编译exmpp模块并复制到/usr/lib/ejabberd/ebin/位置。以下是“my_module”代码。无法在ejabberd中使用“exmpp_xml”模块

-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模块?

编辑:

添加exmpp:开始()的启动方法和c_src复制到ejabberd lib和它的作品。

cp -rf exmpp/c_src/ /usr/lib/ejabberd/ 

我想,既然所有的exmpp依赖是其自己的模块复制exmpp _ *。梁文件到/ usr/lib中/ ejabberd/EBIN /位置,其中ejabberd模块访问中被使用sufficent在ejabberd模块中,但事实并非如此。

尽管上述解决方案的工作原理是什么,安装exmpp模块的正确方法是使其可以在ejabberd模块中使用。

+0

了解如何构建和发布erlang/OTP应用程序 – Lol4t0

回答

0

某些模块需要在使用之前进行初始化 - 它们可能会启动长时间运行的进程或创建ETS表或访问某个远程资源。另外,该模块可能依赖于其他模块,并且模块需要在使用之前进行初始化,但是您不想两次初始化相同的模块!一个OTP“应用程序”(见http://www.erlang.org/doc/design_principles/des_princ.html)封装了所有这些。

通常情况下,你将有一个foo.app文件在您ebin目录,这个程序文件将描述什么应用程序运行时应该运行应用程序之前初始化(以及那些每个人都会有自己的应用程序文件...) 。

这里是我的一个(这实际上是一个.app.src模板文件,该文件Rebar3转变成一个适当的.app文件,但将相关部分是相同的):

{application, mdw, [ 
    {description, "My Doohickey Whatsit"}, 
    {vsn, "1.0.0"}, 
    {id, "git"}, 
    {modules, []}, 
    {registered, []}, 
    {applications, [ 
        kernel 
       ,stdlib 
       ,mnesia 
       ,ssl 
       ,inets 
       ,lager 
       ,erlcloud 
       ,worker_pool 
       ,wutils 
       ,recon 
       ]}, 
    {mod, {mdw_app, []}}, 
    {env, []} 
]}. 

applications一切将在我的申请之前进行初始化。然后,我的mdw_app模块中的start/2方法将被调用。 ERTS将以正确的顺序处理开始的事情,而不是开始两次。