From 29beb42aa2981f91b7482fda6a9f8755d48bf2a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E5=AD=90=E5=8D=9A?= <349832309@qq.com> Date: Wed, 10 Oct 2018 14:00:17 +0800 Subject: [PATCH] Using client id rather then session pid --- src/emqx_protocol.erl | 14 ++++++-------- src/emqx_session.erl | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/emqx_protocol.erl b/src/emqx_protocol.erl index 578417085..bd440cf39 100644 --- a/src/emqx_protocol.erl +++ b/src/emqx_protocol.erl @@ -792,22 +792,20 @@ shutdown(Reason, #pstate{client_id = ClientId}) when Reason =:= conflict; emqx_cm:unregister_connection(ClientId); shutdown(Reason, PState = #pstate{connected = true, client_id = ClientId, - will_msg = WillMsg, - session = Session}) -> + will_msg = WillMsg}) -> ?LOG(info, "Shutdown for ~p", [Reason], PState), - _ = send_willmsg(WillMsg, Session), + _ = send_willmsg(WillMsg, ClientId), emqx_hooks:run('client.disconnected', [credentials(PState), Reason]), emqx_cm:unregister_connection(ClientId). -send_willmsg(undefined, _Session) -> +send_willmsg(undefined, _ClientId) -> ignore; send_willmsg(WillMsg = #message{topic = Topic, - headers = #{'Will-Delay-Interval' := Interval}}, Session) + headers = #{'Will-Delay-Interval' := Interval} = Headers}, ClientId) when is_integer(Interval), Interval > 0 -> SendAfter = integer_to_binary(Interval), - Session1 = list_to_binary(pid_to_list(Session)), - emqx_broker:publish(WillMsg#message{topic = <<"$will/", Session1/binary, "/", SendAfter/binary, "/", Topic/binary>>}); -send_willmsg(WillMsg, _Session) -> + emqx_broker:publish(WillMsg#message{topic = emqx_topic:join([<<"$will">>, SendAfter, Topic]), headers = Headers#{client_id => ClientId}}); +send_willmsg(WillMsg, _ClientId) -> emqx_broker:publish(WillMsg). start_keepalive(0, _PState) -> diff --git a/src/emqx_session.erl b/src/emqx_session.erl index b63b45b18..d327723f5 100644 --- a/src/emqx_session.erl +++ b/src/emqx_session.erl @@ -542,7 +542,7 @@ handle_cast({resume, ConnPid}, State = #state{client_id = ClientId, %% Clean Session: true -> false??? CleanStart andalso emqx_sm:set_session_attrs(ClientId, attrs(State1)), - emqx_hooks:run('session.resumed', [#{client_id => ClientId, session => self()}, attrs(State)]), + emqx_hooks:run('session.resumed', [#{client_id => ClientId}, attrs(State)]), %% Replay delivery and Dequeue pending messages noreply(dequeue(retry_delivery(true, State1)));