【问题标题】:Erlang module mod_confirm_delivery doesn't works with Ejabberd 16.03Erlang 模块 mod_confirm_delivery 不适用于 Ejabberd 16.03
【发布时间】:2017-03-15 22:16:08
【问题描述】:

我正在开发一个 Android 聊天应用程序,我正在尝试运行 Erlang 模块 mod_confirm_delivery 为了接收当用户突然失去互联网连接时发送的所有消息(但仍然出现在服务器上)。该模块正确启动但在 Ejabberd 16.03 上不起作用,实际上发送给“离线”用户的所有消息都丢失了,我做了一些调整,因为该模块是为旧版本的 Ejabberd 创建的,但似乎不是足以让它工作。我声明我不太了解 Erlang 和 Mnesia db,所以不知道如何解决问题。

这里有当用户 1 尝试向“离线”用户 2 发送消息时产生的模块和日志。

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

-author("Johan Vorster").

%% 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, send_packet/4, receive_packet/5, get_session/5, set_offline_message/5]).

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

-record(session, {sid, usr, us, priority, info}).
-record(offline_msg, {us, timestamp, expire, from, to, packet}).
-record(confirm_delivery, {messageid, timerref}).

start(_Host, _Opt) -> 

    ?DEBUG("mod_confirm_delivery loading", []),
    mnesia:create_table(confirm_delivery, 
        [{attributes, record_info(fields, confirm_delivery)}]),
    mnesia:clear_table(confirm_delivery),
    ?DEBUG("created timer ref table", []),

    ?DEBUG("start user_send_packet hook", []),
    ejabberd_hooks:add(user_send_packet, _Host, ?MODULE, send_packet, 50),   
    ?DEBUG("start user_receive_packet hook", []),
    ejabberd_hooks:add(user_receive_packet, _Host, ?MODULE, receive_packet, 50).   

stop(_Host) -> 
    ?DEBUG("stopping mod_confirm_delivery", []),
    ejabberd_hooks:delete(user_send_packet, _Host, ?MODULE, send_packet, 50),
    ejabberd_hooks:delete(user_receive_packet, _Host, ?MODULE, receive_packet, 50). 

%%send_packet(From, To, Packet) ->
send_packet(Packet, C2SState, From, To) ->  
%% ?INFO_MSG("send_packet FromJID ~p ToJID ~p Packet ~p~n",[From, To, Packet]),
?DEBUG("send_packet Packet ~p C2SState ~p FromJID ~p ToJID ~p~n",[Packet, C2SState, From, To]),   

Type = fxml:get_tag_attr_s(<<"type">>, Packet),
?DEBUG("Message Type ~p~n",[Type]),

Body = fxml:get_path_s(Packet, [{elem, <<"body">>}, cdata]), 
?DEBUG("Message Body ~p~n",[Body]),

MessageId = fxml:get_tag_attr_s(<<"id">>, Packet),
?DEBUG("send_packet MessageId ~p~n",[MessageId]), 

LUser = element(2, To),
?DEBUG("send_packet LUser ~p~n",[LUser]), 

LServer = element(3, To), 
?DEBUG("send_packet LServer ~p~n",[LServer]), 

Sessions = mnesia:dirty_index_read(session, {LUser, LServer}, #session.us),
?DEBUG("Session: ~p~n",[Sessions]),

case Type =:= "chat" andalso Body =/= [] andalso Sessions =/= [] of
    true ->                

    {ok, Ref} = timer:apply_after(10000, mod_confirm_delivery, get_session, [LUser, LServer, From, To, Packet]),

    ?DEBUG("Saving To ~p Ref ~p~n",[MessageId, Ref]),

    F = fun() ->
        mnesia:write(#confirm_delivery{messageid=MessageId, timerref=Ref})
    end,

    mnesia:transaction(F);

_ ->
    Packet
end.   

receive_packet(Packet, C2SState, _JID, From, To) ->
?DEBUG("receive_packet JID: ~p From: ~p To: ~p Packet: ~p~n",[_JID, From, To, Packet]), 

Received = fxml:get_subtag(Packet, <<"received">>), 
?DEBUG("receive_packet Received Tag ~p~n",[Received]),    

if Received =/= false andalso Received =/= [] ->
    MessageId = fxml:get_tag_attr_s(<<"id">>, Received),
    ?DEBUG("receive_packet MessageId ~p~n",[MessageId]);       
true ->
    MessageId = []
end, 

if MessageId =/= [] ->
    Record = mnesia:dirty_read(confirm_delivery, MessageId),
    ?DEBUG("receive_packet Record: ~p~n",[Record]);       
true ->
    Record = []
end, 

if Record =/= [] ->
    [R] = Record,
    ?DEBUG("receive_packet Record Elements ~p~n",[R]), 

    Ref = element(3, R),

    ?DEBUG("receive_packet Cancel Timer ~p~n",[Ref]), 
    timer:cancel(Ref),

    mnesia:dirty_delete(confirm_delivery, MessageId),
    ?DEBUG("confirm_delivery clean up",[]);     
true ->
    Packet
end.


get_session(User, Server, From, To, Packet) ->   
?DEBUG("get_session User: ~p Server: ~p From: ~p To ~p Packet ~p~n",[User, Server, From, To, Packet]),   

ejabberd_router:route(From, To, Packet),
?DEBUG("Resend message",[]),

set_offline_message(User, Server, From, To, Packet),
?DEBUG("Set offline message",[]),

MessageId = fxml:get_tag_attr_s(<<"id">>, Packet), 
?DEBUG("get_session MessageId ~p~n",[MessageId]),    

case MessageId =/= [] of
    true ->        

    mnesia:dirty_delete(confirm_delivery, MessageId),
    ?DEBUG("confirm_delivery clean up",[]);

 _ ->
    ok
end.

set_offline_message(User, Server, From, To, Packet) ->
?DEBUG("set_offline_message User: ~p Server: ~p From: ~p To ~p Packet ~p~n",[User, Server, From, To, Packet]),    

F = fun() ->
    mnesia:write(#offline_msg{us = {User, Server}, timestamp = now(), expire = "never", from = From, to = To, packet = Packet})
end,

mnesia:transaction(F).

日志

2016-10-26 16:24:26.320 [debug] <0.6745.7>@ejabberd_sm:do_route:420 session manager
        from {jid,<<"2">>,<<"mydomain.com">>,<<>>,<<"2">>,<<"mydomain.com">>,<<>>}
        to {jid,<<"1">>,<<"mydomain.com">>,<<>>,<<"1">>,<<"mydomain.com">>,<<>>}
        packet {xmlel,<<"presence">>,[{<<"type">>,<<"subs"...>>}],[]}
2016-10-26 16:24:26.345 [debug] <0.6744.7>@ejabberd_receiver:process_data:284 Received XML on stream = <<"<iq to='mydomain.com' id='POJeY-45' type='set'><register xmlns='https://android.googleapis.com/gcm'><key>doyCwvN_NNk:APA91bEx80MxaQ0Nj7wXhlvEUpJgG6bBLqmuyR3XiQaK-pCO7ftVtD1DsYB8RErepCKsutDSjMZP6g9hCvaQGshG9GUY7E8kKSxYy21MI_Agf_WC2WdcNSHwmNoO53AX4Rkqvhrfzfu0</key></register></iq><message to='2@mydomain.com' id='2831541994867' type='chat'><body>{&quot;Date&quot;:&quot;26 ott 2016&quot;,&quot;Time&quot;:&quot;1477491866&quot;,&quot;body&quot;:&quot;hello2&quot;,&quot;isMine&quot;:true,&quot;msgid&quot;:&quot;2831541994867&quot;,&quot;random_id&quot;:&quot;802726696&quot;,&quot;reason&quot;:&quot;chat&quot;,&quot;receiver&quot;:&quot;2&quot;,&quot;sender&quot;:&quot;1&quot;,&quot;senderName&quot;:&quot;1&quot;}</body><thread>4d8f64fb-7012-4649-a123-9dd7873132dd</thread></message><r xmlns='urn:xmpp:sm:3'/>">>
2016-10-26 16:24:26.345 [debug] <0.6744.7>@shaper:update:120 State: {maxrate,1000,496.7201044401154,1477491866318200}, Size=824
M=548.1347834383881, I=27.194
2016-10-26 16:24:26.346 [info] <0.6745.7>@mod_confirm_delivery:send_packet:42 send_packet Packet {xmlel,<<"iq">>,[{<<"xml:lang">>,<<"en">>},{<<"to">>,<<"mydomain.com">>},{<<"id">>,<<"POJeY-45">>},{<<"type">>,<<"set">>}],[{xmlel,<<"register">>,[{<<"xmlns">>,<<"https://android.googleapis.com/gcm">>}],[{xmlel,<<"key">>,[],[{xmlcdata,<<"doyCwvN_NNk:APA91bEx80MxaQ0Nj7wXhlvEUpJgG6bBLqmuyR3XiQaK-pCO7ftVtD1DsYB8RErepCKsutDSjMZP6g9hCvaQGshG9GUY7E8kKSxYy21MI_Agf_WC2WdcNSHwmNoO53AX4Rkqvhrfzfu0">>}]}]}]} C2SState {state,{socket_state,fast_tls,{tlssock,#Port<0.637892>,#Port<0.637893>},<0.6744.7>},ejabberd_socket,#Ref<0.0.1572865.84391>,false,<<"6182426231480078240">>,undefined,c2s,c2s_shaper,false,true,true,true,[verify_none,compression_none,{certfile,<<"/etc/ejabberd/ejabberd.pem">>}],true,{jid,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>},<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,{{1477,489252,221181},<0.6745.7>},{3,{{<<"2">>,<<"mydomain.com">>,<<>>},{{<<"1">>,<<"mydomain.com">>,<<>>},nil,nil},{{<<"3">>,<<"mydomain.com">>,<<>>},nil,nil}}},{3,{{<<"2">>,<<"mydomain.com">>,<<>>},{{<<"1">>,<<"mydomain.com">>,<<>>},nil,nil},{{<<"3">>,<<"mydomain.com">>,<<>>},nil,nil}}},{3,{{<<"1">>,<<"mydomain.com">>,<<>>},nil,{{<<"2">>,<<"mydomain.com">>,<<>>},nil,{{<<"3">>,<<"mydomain.com">>,<<>>},nil,nil}}}},{xmlel,<<"presence">>,[{<<"xml:lang">>,<<"en">>},{<<"id">>,<<"POJeY-6">>}],[{xmlel,<<"c">>,[{<<"xmlns">>,<<"http://jabber.org/protocol/caps">>},{<<"hash">>,<<"sha-1">>},{<<"node">>,<<"http://www.igniterealtime.org/projects/smack">>},{<<"ver">>,<<"NfJ3flI83zSdUDzCEICtbypursw=">>}],[]}]},...} FromJID {jid,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>} ToJID {jid,<<>>,<<"mydomain.com">>,<<>>,<<>>,<<"mydomain.com">>,<<>>}
2016-10-26 16:24:26.346 [info] <0.6745.7>@mod_confirm_delivery:send_packet:45 Message Type <<"set">>
2016-10-26 16:24:26.346 [info] <0.6745.7>@mod_confirm_delivery:send_packet:48 Message Body <<>>
2016-10-26 16:24:26.346 [info] <0.6745.7>@mod_confirm_delivery:send_packet:51 send_packet MessageId <<"POJeY-45">>
2016-10-26 16:24:26.346 [info] <0.6745.7>@mod_confirm_delivery:send_packet:54 send_packet LUser <<>>
2016-10-26 16:24:26.346 [info] <0.6745.7>@mod_confirm_delivery:send_packet:57 send_packet LServer <<"mydomain.com">>
2016-10-26 16:24:26.346 [info] <0.6745.7>@mod_confirm_delivery:send_packet:60 Session: []
2016-10-26 16:24:26.346 [debug] <0.6745.7>@ejabberd_router:do_route:351 route
        from {jid,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>}
        to {jid,<<>>,<<"mydomain.com">>,<<>>,<<>>,<<"mydomain.com">>,<<>>}
        packet {xmlel,<<"iq">>,[{<<"xml:lang">>,<<"en">>},{<<"to">>,<<"mydomain.com">>},{<<"id">>,<<"POJeY-45">>},{<<"type">>,<<"set">>}],[{xmlel,<<"register">>,[{<<"xmlns">>,<<"https://android.googleapis.com/gcm">>}],[{xmlel,<<"key">>,[],[{xmlcdata,<<"doyCwvN_NNk:APA91bEx80MxaQ0Nj7wXhlvEUpJgG6bBLqmuyR3XiQaK-pCO7ftVtD1DsYB8RErepCKsutDSjMZP6g9hCvaQGshG9GUY7E8kKSxYy21MI_Agf_WC2WdcNSHwmNoO53AX4Rkqvhrfzfu0">>}]}]}]}
2016-10-26 16:24:26.347 [debug] <0.6745.7>@ejabberd_local:do_route:261 local route
        from {jid,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>}
        to {jid,<<>>,<<"mydomain.com">>,<<>>,<<>>,<<"mydomain.com">>,<<>>}
        packet {xmlel,<<"iq">>,[{<<"xml:lang">>,<<"en">>},{<<"to">>,<<...>>},{<<...>>,...},{...}],[{xmlel,<<...>>,...}]}
2016-10-26 16:24:26.347 [debug] <0.6745.7>@mod_gcm:iq:156 mod_gcm: updating last_seen for user 1@mydomain.com
2016-10-26 16:24:26.347 [debug] <0.6745.7>@ejabberd_router:do_route:351 route
        from {jid,<<>>,<<"mydomain.com">>,<<>>,<<>>,<<"mydomain.com">>,<<>>}
        to {jid,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>}
        packet {xmlel,<<"iq">>,[{<<"id">>,<<"POJeY-45">>},{<<"type">>,<<"result">>}],[]}
2016-10-26 16:24:26.347 [debug] <0.6745.7>@ejabberd_local:do_route:261 local route
        from {jid,<<>>,<<"mydomain.com">>,<<>>,<<>>,<<"mydomain.com">>,<<>>}
        to {jid,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>}
        packet {xmlel,<<"iq">>,[{<<"id">>,<<"POJe"...>>},{<<"type">>,<<...>>}],[]}
2016-10-26 16:24:26.347 [debug] <0.6745.7>@ejabberd_sm:do_route:420 session manager
        from {jid,<<>>,<<"mydomain.com">>,<<>>,<<>>,<<"mydomain.com">>,<<>>}
        to {jid,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>}
        packet {xmlel,<<"iq">>,[{<<"id">>,<<"POJe"...>>},{<<"type">>,<<...>>}],[]}
2016-10-26 16:24:26.348 [debug] <0.6745.7>@ejabberd_sm:do_route:538 sending to process <0.6745.7>
2016-10-26 16:24:26.348 [info] <0.6745.7>@mod_confirm_delivery:send_packet:42 send_packet Packet {xmlel,<<"message">>,[{<<"xml:lang">>,<<"en">>},{<<"to">>,<<"2@mydomain.com">>},{<<"id">>,<<"2831541994867">>},{<<"type">>,<<"chat">>}],[{xmlel,<<"body">>,[],[{xmlcdata,<<"{\"Date\":\"26 ott 2016\",\"Time\":\"1477491866\",\"body\":\"hello2\",\"isMine\":true,\"msgid\":\"2831541994867\",\"random_id\":\"802726696\",\"reason\":\"chat\",\"receiver\":\"2\",\"sender\":\"1\",\"senderName\":\"1\"}">>}]},{xmlel,<<"thread">>,[],[{xmlcdata,<<"4d8f64fb-7012-4649-a123-9dd7873132dd">>}]}]} C2SState {state,{socket_state,fast_tls,{tlssock,#Port<0.637892>,#Port<0.637893>},<0.6744.7>},ejabberd_socket,#Ref<0.0.1572865.84391>,false,<<"6182426231480078240">>,undefined,c2s,c2s_shaper,false,true,true,true,[verify_none,compression_none,{certfile,<<"/etc/ejabberd/ejabberd.pem">>}],true,{jid,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>},<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,{{1477,489252,221181},<0.6745.7>},{3,{{<<"2">>,<<"mydomain.com">>,<<>>},{{<<"1">>,<<"mydomain.com">>,<<>>},nil,nil},{{<<"3">>,<<"mydomain.com">>,<<>>},nil,nil}}},{3,{{<<"2">>,<<"mydomain.com">>,<<>>},{{<<"1">>,<<"mydomain.com">>,<<>>},nil,nil},{{<<"3">>,<<"mydomain.com">>,<<>>},nil,nil}}},{3,{{<<"1">>,<<"mydomain.com">>,<<>>},nil,{{<<"2">>,<<"mydomain.com">>,<<>>},nil,{{<<"3">>,<<"mydomain.com">>,<<>>},nil,nil}}}},{xmlel,<<"presence">>,[{<<"xml:lang">>,<<"en">>},{<<"id">>,<<"POJeY-6">>}],[{xmlel,<<"c">>,[{<<"xmlns">>,<<"http://jabber.org/protocol/caps">>},{<<"hash">>,<<"sha-1">>},{<<"node">>,<<"http://www.igniterealtime.org/projects/smack">>},{<<"ver">>,<<"NfJ3flI83z...">>}],...}]},...} FromJID {jid,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>} ToJID {jid,<<"2">>,<<"mydomain.com">>,<<>>,<<"2">>,<<"mydomain.com">>,<<>>}
2016-10-26 16:24:26.348 [info] <0.6745.7>@mod_confirm_delivery:send_packet:45 Message Type <<"chat">>
2016-10-26 16:24:26.348 [info] <0.6745.7>@mod_confirm_delivery:send_packet:48 Message Body <<"{\"Date\":\"26 ott 2016\",\"Time\":\"1477491866\",\"body\":\"hello2\",\"isMine\":true,\"msgid\":\"2831541994867\",\"random_id\":\"802726696\",\"reason\":\"chat\",\"receiver\":\"2\",\"sender\":\"1\",\"senderName\":\"1\"}">>
2016-10-26 16:24:26.348 [info] <0.6745.7>@mod_confirm_delivery:send_packet:51 send_packet MessageId <<"2831541994867">>
2016-10-26 16:24:26.348 [info] <0.6745.7>@mod_confirm_delivery:send_packet:54 send_packet LUser <<"2">>
2016-10-26 16:24:26.348 [info] <0.6745.7>@mod_confirm_delivery:send_packet:57 send_packet LServer <<"mydomain.com">>
2016-10-26 16:24:26.349 [info] <0.6745.7>@mod_confirm_delivery:send_packet:60 Session: [{session,{{1477,491691,357100},<0.6738.7>},{<<"2">>,<<"mydomain.com">>,<<"dMeXduJ49Zk">>},{<<"2">>,<<"mydomain.com">>},0,[{ip,{{5,90,200,27},26166}},{conn,c2s_tls},{auth_module,undefined}]}]
2016-10-26 16:24:26.349 [debug] <0.6745.7>@ejabberd_local:do_route:261 local route
        from {jid,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>}
        to {jid,<<"2">>,<<"mydomain.com">>,<<>>,<<"2">>,<<"mydomain.com">>,<<>>}
        packet {xmlel,<<"message">>,[{<<"xml:lang">>,<<"en">>},{<<"to">>,<<...>>},{<<...>>,...},{...}],[{xmlel,<<...>>,...},{xmlel,...}]}
2016-10-26 16:24:26.349 [debug] <0.6745.7>@ejabberd_sm:do_route:420 session manager
        from {jid,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>}
        to {jid,<<"2">>,<<"mydomain.com">>,<<>>,<<"2">>,<<"mydomain.com">>,<<>>}
        packet {xmlel,<<"message">>,[{<<"xml:lang">>,<<"en">>},{<<"to">>,<<...>>},{<<...>>,...},{...}],[{xmlel,<<...>>,...},{xmlel,...}]}
2016-10-26 16:24:26.349 [debug] <0.6745.7>@ejabberd_sm:route_message:584 sending to process <0.6738.7>
2016-10-26 16:24:26.349 [debug] <0.6745.7>@ejabberd_c2s:send_text:1823 Send XML on stream = <<"<a xmlns='urn:xmpp:sm:3' h='20'/>">>
2016-10-26 16:24:26.350 [info] <0.6745.7>@mod_confirm_delivery:receive_packet:80 receive_packet JID: {jid,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>} From: {jid,<<>>,<<"mydomain.com">>,<<>>,<<>>,<<"mydomain.com">>,<<>>} To: {jid,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>} Packet: {xmlel,<<"iq">>,[{<<"from">>,<<"mydomain.com">>},{<<"to">>,<<"1@mydomain.com/doyCwvN_NNk">>},{<<"id">>,<<"POJeY-45">>},{<<"type">>,<<"result">>}],[]}
2016-10-26 16:24:26.350 [info] <0.6745.7>@mod_confirm_delivery:receive_packet:83 receive_packet Received Tag false
2016-10-26 16:24:26.350 [info] <0.6738.7>@mod_confirm_delivery:receive_packet:80 receive_packet JID: {jid,<<"2">>,<<"mydomain.com">>,<<"dMeXduJ49Zk">>,<<"2">>,<<"mydomain.com">>,<<"dMeXduJ49Zk">>} From: {jid,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>,<<"1">>,<<"mydomain.com">>,<<"doyCwvN_NNk">>} To: {jid,<<"2">>,<<"mydomain.com">>,<<>>,<<"2">>,<<"mydomain.com">>,<<>>} Packet: {xmlel,<<"message">>,[{<<"from">>,<<"1@mydomain.com/doyCwvN_NNk">>},{<<"to">>,<<"2@mydomain.com">>},{<<"xml:lang">>,<<"en">>},{<<"id">>,<<"2831541994867">>},{<<"type">>,<<"chat">>}],[{xmlel,<<"body">>,[],[{xmlcdata,<<"{\"Date\":\"26 ott 2016\",\"Time\":\"1477491866\",\"body\":\"hello2\",\"isMine\":true,\"msgid\":\"2831541994867\",\"random_id\":\"802726696\",\"reason\":\"chat\",\"receiver\":\"2\",\"sender\":\"1\",\"senderName\":\"1\"}">>}]},{xmlel,<<"thread">>,[],[{xmlcdata,<<"4d8f64fb-7012-4649-a123-9dd7873132dd">>}]}]}
2016-10-26 16:24:26.350 [debug] <0.6745.7>@ejabberd_c2s:send_text:1823 Send XML on stream = <<"<iq from='mydomain.com' to='1@mydomain.com/doyCwvN_NNk' id='POJeY-45' type='result'/>">>
2016-10-26 16:24:26.350 [debug] <0.6745.7>@ejabberd_c2s:send_text:1823 Send XML on stream = <<"<r xmlns='urn:xmpp:sm:3'/>">>
2016-10-26 16:24:26.350 [info] <0.6738.7>@mod_confirm_delivery:receive_packet:83 receive_packet Received Tag false
2016-10-26 16:24:26.351 [debug] <0.6738.7>@ejabberd_c2s:send_text:1823 Send XML on stream = <<"<message from='1@mydomain.com/doyCwvN_NNk' to='2@mydomain.com' xml:lang='en' id='2831541994867' type='chat'><body>{&quot;Date&quot;:&quot;26 ott 2016&quot;,&quot;Time&quot;:&quot;1477491866&quot;,&quot;body&quot;:&quot;hello2&quot;,&quot;isMine&quot;:true,&quot;msgid&quot;:&quot;2831541994867&quot;,&quot;random_id&quot;:&quot;802726696&quot;,&quot;reason&quot;:&quot;chat&quot;,&quot;receiver&quot;:&quot;2&quot;,&quot;sender&quot;:&quot;1&quot;,&quot;senderName&quot;:&quot;1&quot;}</body><thread>4d8f64fb-7012-4649-a123-9dd7873132dd</thread></message>">>
2016-10-26 16:24:26.351 [debug] <0.6738.7>@ejabberd_c2s:send_text:1823 Send XML on stream = <<"<r xmlns='urn:xmpp:sm:3'/>">>
2016-10-26 16:24:26.867 [debug] <0.6744.7>@ejabberd_receiver:process_data:284 Received XML on stream = <<"<a xmlns='urn:xmpp:sm:3' h='18'/>">>
2016-10-26 16:24:26.867 [debug] <0.6744.7>@shaper:update:120 State: {maxrate,1000,999.7776233539505,1477491866866497}, Size=33
M=32.99266320221285, I=0.751
2016-10-26 16:24:26.867 [debug] <0.6745.7>@ejabberd_c2s:check_h_attribute:2782 1@mydomain.com/doyCwvN_NNk acknowledged 18 of 18 stanzas
2016-10-26 16:24:33.969 [info] <0.16878.5>@ejabberd_listener:accept:333 (#Port<0.637900>) Accepted connection 127.0.0.1:58342 -> 127.0.0.1:5280
2016-10-26 16:24:33.970 [debug] <0.6758.7>@ejabberd_http:init:154 S: [{[<<"websocket">>],ejabberd_http_ws},{[<<"captcha">>],ejabberd_captcha},{[<<"admin">>],ejabberd_web_admin},{[<<"http-bind">>],mod_http_bind}]
2016-10-26 16:24:33.970 [info] <0.6758.7>@ejabberd_http:init:158 started: {gen_tcp,#Port<0.637900>}
2016-10-26 16:24:35.306 [debug] <0.6758.7>@ejabberd_http:process_header:281 (#Port<0.637900>) http query: 'GET' <<"/admin/server/mydomain.com/users/">>
2016-10-26 16:24:35.306 [debug] <0.6758.7>@ejabberd_http:process:353 [<<"admin">>,<<"server">>,<<"mydomain.com">>,<<"users">>] matches [<<"admin">>]
2016-10-26 16:24:36.915 [debug] <0.6758.7>@ejabberd_http:process_header:281 (#Port<0.637900>) http query: 'GET' <<"/admin/server/mydomain.com/users/">>
2016-10-26 16:24:36.915 [debug] <0.6758.7>@ejabberd_http:process:353 [<<"admin">>,<<"server">>,<<"mydomain.com">>,<<"users">>] matches [<<"admin">>]

【问题讨论】:

    标签: android erlang ejabberd


    【解决方案1】:

    ejabberd 具有 c2s 侦听器的流管理选项。您应该将选项 stream_management 设置为 true。 .执行此操作后,您还必须从客户端 (android) 启用流管理,您不需要实现 mod_confirm_delivery。 . 当用户突然失去互联网连接(但仍然出现在服务器上)您可以通过在 ejabberd 服务器中启用 mod_ping 模块来解决此问题。 Reference ejabberd configuration Stream Management reference

    【讨论】:

    • 感谢您的回复,但我不认为 mod_ping 是最好的解决方案,有一个时间窗口,用户可以释放所有消息,请看这篇文章中的场景,因为是我的也是:stackoverflow.com/questions/17424254/… 并查看@JohanVorster 的答案。
    猜你喜欢
    • 2016-09-08
    • 2015-09-15
    • 1970-01-01
    • 2017-01-13
    • 2015-09-10
    • 2020-01-31
    • 2013-09-22
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多