thingsboard-aplcache

Details

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 bb2107b..2b28d39 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<Tenant> 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<Tenant> 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 c2fc24a..e7e7a63 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<RuleId, ActorRef> ruleActors;
     protected final TenantId tenantId;
 
-    Map<RuleMetaData, RuleActorMetaData> ruleMap = new HashMap<>();
+    private Map<RuleMetaData, RuleActorMetaData> 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<RuleMetaData> 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<ActorRef> 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 12278bb..913d8c6 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 2fbe1ac..e6f3d09 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());
     }