diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_mirror_queue_mode.erl | 7 | ||||
| -rw-r--r-- | src/rabbit_registry.erl | 42 | ||||
| -rw-r--r-- | src/rabbit_registry_class.erl | 18 |
3 files changed, 39 insertions, 28 deletions
diff --git a/src/rabbit_mirror_queue_mode.erl b/src/rabbit_mirror_queue_mode.erl index 5bb243746a..e83b4c8425 100644 --- a/src/rabbit_mirror_queue_mode.erl +++ b/src/rabbit_mirror_queue_mode.erl @@ -16,6 +16,10 @@ -module(rabbit_mirror_queue_mode). +-behaviour(rabbit_registry_class). + +-export([added_to_rabbit_registry/2, removed_from_rabbit_registry/1]). + -ifdef(use_specs). -type(master() :: node()). @@ -55,3 +59,6 @@ behaviour_info(_Other) -> undefined. -endif. + +added_to_rabbit_registry(_Type, _ModuleName) -> ok. +removed_from_rabbit_registry(_Type) -> ok. diff --git a/src/rabbit_registry.erl b/src/rabbit_registry.erl index 6633a279a7..252a57d2dc 100644 --- a/src/rabbit_registry.erl +++ b/src/rabbit_registry.erl @@ -83,18 +83,22 @@ internal_binary_to_type(TypeBin) when is_binary(TypeBin) -> internal_register(Class, TypeName, ModuleName) when is_atom(Class), is_binary(TypeName), is_atom(ModuleName) -> - ok = sanity_check_module(class_module(Class), ModuleName), - RegArg = {{Class, internal_binary_to_type(TypeName)}, ModuleName}, + ClassModule = class_module(Class), + Type = internal_binary_to_type(TypeName), + RegArg = {{Class, Type}, ModuleName}, + ok = sanity_check_module(ClassModule, ModuleName), true = ets:insert(?ETS_NAME, RegArg), conditional_register(RegArg), - registered(RegArg), + ok = ClassModule:added_to_rabbit_registry(Type, ModuleName), ok. internal_unregister(Class, TypeName) -> - UnregArg = {Class, internal_binary_to_type(TypeName)}, + ClassModule = class_module(Class), + Type = internal_binary_to_type(TypeName), + UnregArg = {Class, Type}, conditional_unregister(UnregArg), true = ets:delete(?ETS_NAME, UnregArg), - unregistered(UnregArg), + ok = ClassModule:removed_from_rabbit_registry(Type), ok. %% register exchange decorator route callback only when implemented, @@ -116,29 +120,6 @@ conditional_unregister({exchange_decorator, Type}) -> conditional_unregister(_) -> ok. -% update channels to enable/disable interceptors -registered({{Class, Type}, ModuleName}) -> - ClassModule = class_module(Class), - case proplists:get_value(registered, ClassModule:module_info(functions)) of - 2 -> ClassModule:registered(Type, ModuleName); - undefined -> ok; - Arity -> - rabbit_log:error("Wrong arity '~p' of ~p:registered. Should be 2", - [Arity, ClassModule]) - end. - -unregistered({Class, Type}) -> - ClassModule = class_module(Class), - Functions = ClassModule:module_info(functions), - case proplists:get_value(unregistered, Functions) of - 1 -> ClassModule:unregistered(Type); - undefined -> ok; - Arity -> - rabbit_log:error("Wrong arity '~p' of ~p:unregistered. Should be 1", - [Arity, ClassModule]) - end. - - sanity_check_module(ClassModule, Module) -> case catch lists:member(ClassModule, lists:flatten( @@ -151,6 +132,11 @@ sanity_check_module(ClassModule, Module) -> true -> ok end. + +% Registry class modules. There should exist module for each registry class. +% Class module should be behaviour (export behaviour_info/1) and implement +% rabbit_registry_class behaviour itself: export added_to_rabbit_registry/2 +% and removed_from_rabbit_registry/1 functions. class_module(exchange) -> rabbit_exchange_type; class_module(auth_mechanism) -> rabbit_auth_mechanism; class_module(runtime_parameter) -> rabbit_runtime_parameter; diff --git a/src/rabbit_registry_class.erl b/src/rabbit_registry_class.erl new file mode 100644 index 0000000000..366850c0e5 --- /dev/null +++ b/src/rabbit_registry_class.erl @@ -0,0 +1,18 @@ +-module(rabbit_registry_class). + +-ifdef(use_specs). + +-callback added_to_rabbit_registry(atom(), atom()) -> ok. + +-callback removed_from_rabbit_registry(atom()) -> ok. + +-else. + +-export([behaviour_info/1]). + +behaviour_info(callbacks) -> + [{added_to_rabbit_registry, 2}, {removed_from_rabbit_registry, 1}]; +behaviour_info(_Other) -> + undefined. + +-endif. |
