Erlang 在eJabberd模块中使用Beanstalkd

Erlang 在eJabberd模块中使用Beanstalkd,erlang,xmpp,ejabberd,Erlang,Xmpp,Ejabberd,我使用eJabberd作为我的XMPP服务器。我正在开发一个模块,它将过滤带有type=queue的消息,然后将它们添加到工作队列Beanstalkd中 问题:每次我收到type=“queue”消息时,我都会连接到豆茎。我认为这是错误的 方法:我试图 {ok,Q}=beanstalk:connect(),在start(\u Host,\u Opt)中,但是由于put(Pid,Data)->put(Pid,Data,[])需要Pid,我不知道如何将Pid从start传递到on过滤器 %%

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

问题:每次我收到type=“queue”消息时,我都会连接到豆茎。我认为这是错误的

方法:我试图
{ok,Q}=beanstalk:connect(),
start(\u Host,\u Opt)
中,但是由于
put(Pid,Data)->put(Pid,Data,[])
需要Pid,我不知道如何将Pid从start传递到on过滤器

    %% 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.
%%模块的名称必须与文件名匹配
-模块(mod_beanstalkd)。
%%每个ejabberd模块都实现gen_mod行为
%%gen_mod行为需要两个功能:启动/2和停止/1
-行为(gen_mod)。
%%此模块的公共方法
-导出([start/2,stop/1,on\u filter\u packet/1])。
%%包括用于写入ejabberd日志文件
-包括(“ejabberd.hrl”)。
-包括(“jlib.hrl”)。
开始(_主机,_选项)->
?信息信息(“启动模块beanstalkd”,[]),
ejabberd_钩子:添加(过滤器_包,全局,?模块,过滤器_包上,120)。
停止(\u主机)->
?信息消息(“停止模组豆茎”,[]),
ejabberd_hooks:delete(filter_数据包,全局,?模块,on_filter_数据包,120)。
在_filter_数据包({From,To,XML}=packet)->
?信息信息(“在豆茎上~p~n,[Packet]),
Type=xml:get_tag_attr_s(,xml),
案例类型=:=andalso DataTag=:=false of
正确->
?信息消息(“on_beanstalkd service=True”,[]),
{ok,Q}=beanstalk:connect(),
JSON=xml:get\u标记\u cdata(xml:get\u子标记(xml,),
{inserted,ID}=beanstalk:put(Q,JSON),
返回=数据包,
错误->
返回=数据包,
?信息消息(“在豆茎上,否则返回~p~n”,[Return])
终止
回来