retained messages
This commit is contained in:
parent
953df5f9f7
commit
eedfd41a45
|
@ -66,7 +66,7 @@ start_link() ->
|
||||||
|
|
||||||
route(Msg) ->
|
route(Msg) ->
|
||||||
% need to retain?
|
% need to retain?
|
||||||
emqtt_retained:retain(Message),
|
emqtt_retained:retain(Msg),
|
||||||
% unset flag and pubsub
|
% unset flag and pubsub
|
||||||
emqtt_pubsub:publish( emqtt_message:unset_flag(Msg) ).
|
emqtt_pubsub:publish( emqtt_message:unset_flag(Msg) ).
|
||||||
|
|
||||||
|
|
|
@ -62,17 +62,17 @@ start_link(RetainOpts) ->
|
||||||
retain(#mqtt_message{ retain = false }) -> ignore;
|
retain(#mqtt_message{ retain = false }) -> ignore;
|
||||||
|
|
||||||
%% RETAIN flag set to 1 and payload containing zero bytes
|
%% RETAIN flag set to 1 and payload containing zero bytes
|
||||||
retain(Msg = #mqtt_message{ retain = true, topic = Topic, payload = <<>> }) ->
|
retain(#mqtt_message{ retain = true, topic = Topic, payload = <<>> }) ->
|
||||||
mnesia:dirty_delete(?RETAINED_TAB, Topic);
|
mnesia:dirty_delete(?RETAINED_TAB, Topic);
|
||||||
|
|
||||||
retain(Msg = #mqtt_message{retain = true}) ->
|
retain(Msg = #mqtt_message{retain = true}) ->
|
||||||
gen_server:cast(?SERVER, {retain, Msg}), Msg;
|
gen_server:cast(?SERVER, {retain, Msg}).
|
||||||
|
|
||||||
%%
|
%%
|
||||||
subscribe(Topics, CPid) when is_pid(CPid) ->
|
subscribe(Topics, CPid) when is_pid(CPid) ->
|
||||||
RetainedMsgs = lists:flatten([mnesia:dirty_read(?RETAINED_TAB, Topic) || Topic <- match(Topics)])
|
RetainedMsgs = lists:flatten([mnesia:dirty_read(?RETAINED_TAB, Topic) || Topic <- match(Topics)]),
|
||||||
lists:foreach(fun(Msg) ->
|
lists:foreach(fun(Msg) ->
|
||||||
CPid ! {dispatch, {self(), retained_msg(Msg}}
|
CPid ! {dispatch, {self(), retained_msg(Msg)}}
|
||||||
end, RetainedMsgs).
|
end, RetainedMsgs).
|
||||||
|
|
||||||
%% ------------------------------------------------------------------
|
%% ------------------------------------------------------------------
|
||||||
|
@ -91,11 +91,13 @@ init([RetainOpts]) ->
|
||||||
handle_call(_Request, _From, State) ->
|
handle_call(_Request, _From, State) ->
|
||||||
{reply, ok, State}.
|
{reply, ok, State}.
|
||||||
|
|
||||||
handle_cast({retain, Msg}, State = #state{store_limit = Limit}) ->
|
handle_cast({retain, Msg = #mqtt_message{ qos = Qos,
|
||||||
|
topic = Topic,
|
||||||
|
payload = Payload }}, State = #state{store_limit = Limit}) ->
|
||||||
case mnesia:table_info(?RETAINED_TAB, size) of
|
case mnesia:table_info(?RETAINED_TAB, size) of
|
||||||
Size >= Limit ->
|
Size when Size >= Limit ->
|
||||||
lager:error("Server dropped message(retain) for table is full: ~p", [Msg]);
|
lager:error("Server dropped message(retain) for table is full: ~p", [Msg]);
|
||||||
true ->
|
_ ->
|
||||||
lager:info("Server retained message: ~p", [Msg]),
|
lager:info("Server retained message: ~p", [Msg]),
|
||||||
mnesia:dirty_write(#mqtt_retained{ topic = Topic,
|
mnesia:dirty_write(#mqtt_retained{ topic = Topic,
|
||||||
qos = Qos,
|
qos = Qos,
|
||||||
|
|
Loading…
Reference in New Issue