在eJabberd模块中使用Beanstalkd

时间:2014-07-23 06:51:12

标签: erlang xmpp ejabberd

我正在使用eJabberd作为我的XMPP服务器。我正在开发一个模块,用type=queue过滤消息,然后将它们添加到工作队列Beanstalkd。

问题:每当我收到type =“queue”的消息时,我都会连接到beanstalkd。我认为这是不正确的。

方法:我试图放 {ok, Q} = beanstalk:connect(),中的start(_Host, _Opt),但由于put(Pid, Data) -> put(Pid, Data,[])需要Pid,我不知道如何传递Pid,从开始到on_filter

    %% name of module must match file name
    -module(mod_beanstalkd).

    %% Every ejabberd module implements the gen_mod behavior
    %% The gen_mod behavior requires two functions: start/2 and stop/1
    -behaviour(gen_mod).

    %% public methods for this module
    -export([start/2, stop/1, on_filter_packet/1]).

    %% included for writing to ejabberd log file
    -include("ejabberd.hrl").
    -include("jlib.hrl").

    start(_Host, _Opt) -> 
        ?INFO_MSG("starting mod_beanstalkd", []),
        ejabberd_hooks:add(filter_packet, global, ?MODULE, on_filter_packet, 120).

    stop(_Host) -> 
        ?INFO_MSG("stopping mod_beanstalkd", []),
        ejabberd_hooks:delete(filter_packet, global, ?MODULE, on_filter_packet, 120).

    on_filter_packet({From, To, XML} = Packet) ->
        ?INFO_MSG("on_beanstalkd ~p~n", [Packet]),
        Type = xml:get_tag_attr_s(<<"type">>, XML),
        case Type =:= <<"service">> andalso DataTag =:= false of
        true -> 
            ?INFO_MSG("on_beanstalkd service = True", []),
            {ok, Q} = beanstalk:connect(),
            JSON = xml:get_tag_cdata(xml:get_subtag(XML, <<"body">>)),
            {inserted, ID} = beanstalk:put(Q, JSON),
            Return = Packet,
        false ->
            Return = Packet,
            ?INFO_MSG("on_beanstalkd ELSE Return ~p~n", [Return])
        end,   
        Return.

0 个答案:

没有答案