summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rabbit_mirror_queue_mode.erl7
-rw-r--r--src/rabbit_registry.erl42
-rw-r--r--src/rabbit_registry_class.erl18
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.