2015-10-14 26 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將以正確的順序處理開始的事情,而不是開始兩次。