1

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 lib にコピーすると、機能します。

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

exmppの依存関係はすべて独自のモジュール内にあるため、exmpp_*.beam ファイルを ejabberd モジュールがアクセスできる /usr/lib/ejabberd/ebin/ の場所にコピーするだけで、ejabberd モジュールで使用するのに十分だと思いましたが、そうではありませんケース。

上記の解決策は機能しますが、exmpp モジュールをインストールして ejabberd モジュールで使用できるようにする正しい方法は何ですか。

4

1 に答える 1

0

一部のモジュールは、使用する前に初期化する必要があります。長時間実行されるプロセスを開始したり、ETS テーブルを作成したり、リモート リソースにアクセスしたりする場合があります。また、モジュールは他のモジュールに依存している可能性があり、そのモジュールは使用する前に初期化する必要がありますが、同じモジュールを 2 回初期化する必要はありません。OTP「アプリケーション」 ( http://www.erlang.org/doc/design_principles/des_princ.htmlを参照) は、これらすべてをカプセル化します。

通常、ディレクトリにはfoo.appファイルebinがあり、このアプリ ファイルには、アプリケーションを実行する前にランタイムが初期化する必要があるアプリケーションが記述されています (それぞれに独自のアプリ ファイルがあります...)。

これは私のものです (これは実際には、Rebar3 が適切な .app ファイルに変換する .app.src テンプレート ファイルですが、依存部分は同じです):

{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アプリケーションの前にすべてが初期化されます。次に、モジュールstart/2内のメソッドが呼び出されます。mdw_appERTS は物事を正しい順序で開始し、物事を 2 回開始することはありません。

于 2015-10-14T13:05:50.883 に答える