diff --git a/application/src/main/java/org/thingsboard/server/actors/app/AppActor.java b/application/src/main/java/org/thingsboard/server/actors/app/AppActor.java index bb2107b192..2b28d3990d 100644 --- a/application/src/main/java/org/thingsboard/server/actors/app/AppActor.java +++ b/application/src/main/java/org/thingsboard/server/actors/app/AppActor.java @@ -78,11 +78,13 @@ public class AppActor extends ContextAwareActor { ruleManager.init(this.context()); pluginManager.init(this.context()); - PageDataIterable tenantIterator = new PageDataIterable<>(link -> tenantService.findTenants(link), ENTITY_PACK_LIMIT); - for (Tenant tenant : tenantIterator) { - logger.debug("[{}] Creating tenant actor", tenant.getId()); - getOrCreateTenantActor(tenant.getId()); - logger.debug("Tenant actor created."); + if (systemContext.isTenantComponentsInitEnabled()) { + PageDataIterable tenantIterator = new PageDataIterable<>(tenantService::findTenants, ENTITY_PACK_LIMIT); + for (Tenant tenant : tenantIterator) { + logger.debug("[{}] Creating tenant actor", tenant.getId()); + getOrCreateTenantActor(tenant.getId()); + logger.debug("Tenant actor created."); + } } logger.info("Main system actor started."); @@ -181,13 +183,8 @@ public class AppActor extends ContextAwareActor { } private ActorRef getOrCreateTenantActor(TenantId tenantId) { - ActorRef tenantActor = tenantActors.get(tenantId); - if (tenantActor == null) { - tenantActor = context().actorOf(Props.create(new TenantActor.ActorCreator(systemContext, tenantId)) - .withDispatcher(DefaultActorService.CORE_DISPATCHER_NAME), tenantId.toString()); - tenantActors.put(tenantId, tenantActor); - } - return tenantActor; + return tenantActors.computeIfAbsent(tenantId, k -> context().actorOf(Props.create(new TenantActor.ActorCreator(systemContext, tenantId)) + .withDispatcher(DefaultActorService.CORE_DISPATCHER_NAME), tenantId.toString())); } private void processTermination(Terminated message) { diff --git a/application/src/main/java/org/thingsboard/server/actors/shared/rule/RuleManager.java b/application/src/main/java/org/thingsboard/server/actors/shared/rule/RuleManager.java index c2fc24ae91..e7e7a63f7e 100644 --- a/application/src/main/java/org/thingsboard/server/actors/shared/rule/RuleManager.java +++ b/application/src/main/java/org/thingsboard/server/actors/shared/rule/RuleManager.java @@ -44,7 +44,7 @@ public abstract class RuleManager { protected final Map ruleActors; protected final TenantId tenantId; - Map ruleMap = new HashMap<>(); + private Map ruleMap; private RuleActorChain ruleChain; public RuleManager(ActorSystemContext systemContext, TenantId tenantId) { @@ -55,6 +55,10 @@ public abstract class RuleManager { } public void init(ActorContext context) { + doInit(context); + } + + private void doInit(ActorContext context) { PageDataIterable ruleIterator = new PageDataIterable<>(getFetchRulesFunction(), ContextAwareActor.ENTITY_PACK_LIMIT); ruleMap = new HashMap<>(); @@ -62,8 +66,7 @@ public abstract class RuleManager { for (RuleMetaData rule : ruleIterator) { log.debug("[{}] Creating rule actor {}", rule.getId(), rule); ActorRef ref = getOrCreateRuleActor(context, rule.getId()); - RuleActorMetaData actorMd = RuleActorMetaData.systemRule(rule.getId(), rule.getWeight(), ref); - ruleMap.put(rule, actorMd); + ruleMap.put(rule, RuleActorMetaData.systemRule(rule.getId(), rule.getWeight(), ref)); log.debug("[{}] Rule actor created.", rule.getId()); } @@ -72,7 +75,7 @@ public abstract class RuleManager { public Optional update(ActorContext context, RuleId ruleId, ComponentLifecycleEvent event) { if (ruleMap == null) { - init(context); + doInit(context); } RuleMetaData rule; if (event != ComponentLifecycleEvent.DELETED) { @@ -114,8 +117,8 @@ public abstract class RuleManager { } public RuleActorChain getRuleChain(ActorContext context) { - if (ruleMap == null) { - init(context); + if (ruleChain == null) { + doInit(context); } return ruleChain; } diff --git a/application/src/main/java/org/thingsboard/server/actors/shared/rule/TenantRuleManager.java b/application/src/main/java/org/thingsboard/server/actors/shared/rule/TenantRuleManager.java index 12278bb09a..913d8c6905 100644 --- a/application/src/main/java/org/thingsboard/server/actors/shared/rule/TenantRuleManager.java +++ b/application/src/main/java/org/thingsboard/server/actors/shared/rule/TenantRuleManager.java @@ -28,6 +28,7 @@ public class TenantRuleManager extends RuleManager { super(systemContext, tenantId); } + @Override public void init(ActorContext context) { if (systemContext.isTenantComponentsInitEnabled()) { super.init(context); diff --git a/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java b/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java index 2fbe1accd7..e6f3d09f3d 100644 --- a/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java +++ b/application/src/main/java/org/thingsboard/server/actors/tenant/TenantActor.java @@ -151,7 +151,8 @@ public class TenantActor extends ContextAwareActor { private void process(RuleChainDeviceMsg msg) { ToDeviceActorMsg toDeviceActorMsg = msg.getToDeviceActorMsg(); ActorRef deviceActor = getOrCreateDeviceActor(toDeviceActorMsg.getDeviceId()); - RuleActorChain chain = new ComplexRuleActorChain(msg.getRuleChain(), ruleManager.getRuleChain(this.context())); + RuleActorChain tenantChain = ruleManager.getRuleChain(this.context()); + RuleActorChain chain = new ComplexRuleActorChain(msg.getRuleChain(), tenantChain); deviceActor.tell(new RuleChainDeviceMsg(toDeviceActorMsg, chain), context().self()); }