Erlang 在eJabberd模块中使用Beanstalkd
我使用eJabberd作为我的XMPP服务器。我正在开发一个模块,它将过滤带有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过滤器 %%
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])
终止
回来