1%% This Source Code Form is subject to the terms of the Mozilla Public 2%% License, v. 2.0. If a copy of the MPL was not distributed with this 3%% file, You can obtain one at https://mozilla.org/MPL/2.0/. 4%% 5%% Copyright (c) 2007-2021 VMware, Inc. or its affiliates. All rights reserved. 6%% 7 8-module(rabbit_queue_decorator). 9 10-include_lib("rabbit_common/include/rabbit.hrl"). 11-include("amqqueue.hrl"). 12 13-export([select/1, set/1, register/2, unregister/1]). 14 15-behaviour(rabbit_registry_class). 16 17-export([added_to_rabbit_registry/2, removed_from_rabbit_registry/1]). 18 19%%---------------------------------------------------------------------------- 20 21-callback startup(amqqueue:amqqueue()) -> 'ok'. 22 23-callback shutdown(amqqueue:amqqueue()) -> 'ok'. 24 25-callback policy_changed(amqqueue:amqqueue(), amqqueue:amqqueue()) -> 26 'ok'. 27 28-callback active_for(amqqueue:amqqueue()) -> boolean(). 29 30%% called with Queue, MaxActivePriority, IsEmpty 31-callback consumer_state_changed( 32 amqqueue:amqqueue(), integer(), boolean()) -> 'ok'. 33 34%%---------------------------------------------------------------------------- 35 36added_to_rabbit_registry(_Type, _ModuleName) -> ok. 37removed_from_rabbit_registry(_Type) -> ok. 38 39select(Modules) -> 40 [M || M <- Modules, code:which(M) =/= non_existing]. 41 42set(Q) when ?is_amqqueue(Q) -> 43 Decorators = [D || D <- list(), D:active_for(Q)], 44 amqqueue:set_decorators(Q, Decorators). 45 46list() -> [M || {_, M} <- rabbit_registry:lookup_all(queue_decorator)]. 47 48register(TypeName, ModuleName) -> 49 rabbit_registry:register(queue_decorator, TypeName, ModuleName), 50 [maybe_recover(Q) || Q <- rabbit_amqqueue:list()], 51 ok. 52 53unregister(TypeName) -> 54 rabbit_registry:unregister(queue_decorator, TypeName), 55 [maybe_recover(Q) || Q <- rabbit_amqqueue:list()], 56 ok. 57 58maybe_recover(Q0) when ?is_amqqueue(Q0) -> 59 Name = amqqueue:get_name(Q0), 60 Decs0 = amqqueue:get_decorators(Q0), 61 Q1 = set(Q0), 62 Decs1 = amqqueue:get_decorators(Q1), 63 Old = lists:sort(select(Decs0)), 64 New = lists:sort(select(Decs1)), 65 case New of 66 Old -> 67 ok; 68 _ -> 69 %% TODO LRB JSP 160169569 should startup be passed Q1 here? 70 [M:startup(Q0) || M <- New -- Old], 71 rabbit_amqqueue:update_decorators(Name) 72 end. 73