diff --git a/apps/emqx_modules/src/emqx_delayed.erl b/apps/emqx_modules/src/emqx_delayed.erl index abba0c4ca..8be7e1419 100644 --- a/apps/emqx_modules/src/emqx_delayed.erl +++ b/apps/emqx_modules/src/emqx_delayed.erl @@ -47,6 +47,7 @@ , list/1 , get_delayed_message/1 , delete_delayed_message/1 + , post_config_update/5 ]). -export([format_delayed/1]). @@ -189,11 +190,30 @@ delete_delayed_message(Id0) -> update_config(Config) -> emqx_conf:update([delayed], Config, #{rawconf_with_defaults => true, override_to => cluster}). +post_config_update(_KeyPath, Config, _NewConf, _OldConf, _AppEnvs) -> + case maps:get(<<"enable">>, Config, undefined) of + undefined -> + ignore; + true -> + emqx_delayed:enable(); + false -> + emqx_delayed:disable() + end, + case maps:get(<<"max_delayed_messages">>, Config, undefined) of + undefined -> + ignore; + Max -> + ok = emqx_delayed:set_max_delayed_messages(Max) + end, + ok. + %%-------------------------------------------------------------------- %% gen_server callback %%-------------------------------------------------------------------- init([Opts]) -> + erlang:process_flag(trap_exit, true), + emqx_conf:add_handler([delayed], ?MODULE), MaxDelayedMessages = maps:get(max_delayed_messages, Opts, 0), {ok, ensure_stats_event( ensure_publish_timer(#{timer => undefined, @@ -252,6 +272,7 @@ handle_info(Info, State) -> {noreply, State}. terminate(_Reason, #{timer := TRef}) -> + emqx_conf:remove_handler([delayed]), emqx_misc:cancel_timer(TRef). code_change(_Vsn, State, _Extra) -> diff --git a/apps/emqx_modules/src/emqx_delayed_api.erl b/apps/emqx_modules/src/emqx_delayed_api.erl index 9a878f7f2..cee9298ea 100644 --- a/apps/emqx_modules/src/emqx_delayed_api.erl +++ b/apps/emqx_modules/src/emqx_delayed_api.erl @@ -224,20 +224,6 @@ generate_max_delayed_messages(Config) -> update_config_(Config) -> case emqx_delayed:update_config(Config) of {ok, #{raw_config := NewDelayed}} -> - case maps:get(<<"enable">>, Config, undefined) of - undefined -> - ignore; - true -> - emqx_delayed:enable(); - false -> - emqx_delayed:disable() - end, - case maps:get(<<"max_delayed_messages">>, Config, undefined) of - undefined -> - ignore; - Max -> - ok = emqx_delayed:set_max_delayed_messages(Max) - end, {200, NewDelayed}; {error, Reason} -> Message = list_to_binary(