Commit 25db0b73fd59c89b1c50c04ebf6d43e31f6072ef

Authored by Andrew Shvayka
1 parent 9be5c367

Improvements to Tenant Actor initialization

@@ -78,11 +78,13 @@ public class AppActor extends ContextAwareActor { @@ -78,11 +78,13 @@ public class AppActor extends ContextAwareActor {
78 ruleManager.init(this.context()); 78 ruleManager.init(this.context());
79 pluginManager.init(this.context()); 79 pluginManager.init(this.context());
80 80
81 - PageDataIterable<Tenant> tenantIterator = new PageDataIterable<>(link -> tenantService.findTenants(link), ENTITY_PACK_LIMIT);  
82 - for (Tenant tenant : tenantIterator) {  
83 - logger.debug("[{}] Creating tenant actor", tenant.getId());  
84 - getOrCreateTenantActor(tenant.getId());  
85 - logger.debug("Tenant actor created."); 81 + if (systemContext.isTenantComponentsInitEnabled()) {
  82 + PageDataIterable<Tenant> tenantIterator = new PageDataIterable<>(tenantService::findTenants, ENTITY_PACK_LIMIT);
  83 + for (Tenant tenant : tenantIterator) {
  84 + logger.debug("[{}] Creating tenant actor", tenant.getId());
  85 + getOrCreateTenantActor(tenant.getId());
  86 + logger.debug("Tenant actor created.");
  87 + }
86 } 88 }
87 89
88 logger.info("Main system actor started."); 90 logger.info("Main system actor started.");
@@ -181,13 +183,8 @@ public class AppActor extends ContextAwareActor { @@ -181,13 +183,8 @@ public class AppActor extends ContextAwareActor {
181 } 183 }
182 184
183 private ActorRef getOrCreateTenantActor(TenantId tenantId) { 185 private ActorRef getOrCreateTenantActor(TenantId tenantId) {
184 - ActorRef tenantActor = tenantActors.get(tenantId);  
185 - if (tenantActor == null) {  
186 - tenantActor = context().actorOf(Props.create(new TenantActor.ActorCreator(systemContext, tenantId))  
187 - .withDispatcher(DefaultActorService.CORE_DISPATCHER_NAME), tenantId.toString());  
188 - tenantActors.put(tenantId, tenantActor);  
189 - }  
190 - return tenantActor; 186 + return tenantActors.computeIfAbsent(tenantId, k -> context().actorOf(Props.create(new TenantActor.ActorCreator(systemContext, tenantId))
  187 + .withDispatcher(DefaultActorService.CORE_DISPATCHER_NAME), tenantId.toString()));
191 } 188 }
192 189
193 private void processTermination(Terminated message) { 190 private void processTermination(Terminated message) {
@@ -44,7 +44,7 @@ public abstract class RuleManager { @@ -44,7 +44,7 @@ public abstract class RuleManager {
44 protected final Map<RuleId, ActorRef> ruleActors; 44 protected final Map<RuleId, ActorRef> ruleActors;
45 protected final TenantId tenantId; 45 protected final TenantId tenantId;
46 46
47 - Map<RuleMetaData, RuleActorMetaData> ruleMap = new HashMap<>(); 47 + private Map<RuleMetaData, RuleActorMetaData> ruleMap;
48 private RuleActorChain ruleChain; 48 private RuleActorChain ruleChain;
49 49
50 public RuleManager(ActorSystemContext systemContext, TenantId tenantId) { 50 public RuleManager(ActorSystemContext systemContext, TenantId tenantId) {
@@ -55,6 +55,10 @@ public abstract class RuleManager { @@ -55,6 +55,10 @@ public abstract class RuleManager {
55 } 55 }
56 56
57 public void init(ActorContext context) { 57 public void init(ActorContext context) {
  58 + doInit(context);
  59 + }
  60 +
  61 + private void doInit(ActorContext context) {
58 PageDataIterable<RuleMetaData> ruleIterator = new PageDataIterable<>(getFetchRulesFunction(), 62 PageDataIterable<RuleMetaData> ruleIterator = new PageDataIterable<>(getFetchRulesFunction(),
59 ContextAwareActor.ENTITY_PACK_LIMIT); 63 ContextAwareActor.ENTITY_PACK_LIMIT);
60 ruleMap = new HashMap<>(); 64 ruleMap = new HashMap<>();
@@ -62,8 +66,7 @@ public abstract class RuleManager { @@ -62,8 +66,7 @@ public abstract class RuleManager {
62 for (RuleMetaData rule : ruleIterator) { 66 for (RuleMetaData rule : ruleIterator) {
63 log.debug("[{}] Creating rule actor {}", rule.getId(), rule); 67 log.debug("[{}] Creating rule actor {}", rule.getId(), rule);
64 ActorRef ref = getOrCreateRuleActor(context, rule.getId()); 68 ActorRef ref = getOrCreateRuleActor(context, rule.getId());
65 - RuleActorMetaData actorMd = RuleActorMetaData.systemRule(rule.getId(), rule.getWeight(), ref);  
66 - ruleMap.put(rule, actorMd); 69 + ruleMap.put(rule, RuleActorMetaData.systemRule(rule.getId(), rule.getWeight(), ref));
67 log.debug("[{}] Rule actor created.", rule.getId()); 70 log.debug("[{}] Rule actor created.", rule.getId());
68 } 71 }
69 72
@@ -72,7 +75,7 @@ public abstract class RuleManager { @@ -72,7 +75,7 @@ public abstract class RuleManager {
72 75
73 public Optional<ActorRef> update(ActorContext context, RuleId ruleId, ComponentLifecycleEvent event) { 76 public Optional<ActorRef> update(ActorContext context, RuleId ruleId, ComponentLifecycleEvent event) {
74 if (ruleMap == null) { 77 if (ruleMap == null) {
75 - init(context); 78 + doInit(context);
76 } 79 }
77 RuleMetaData rule; 80 RuleMetaData rule;
78 if (event != ComponentLifecycleEvent.DELETED) { 81 if (event != ComponentLifecycleEvent.DELETED) {
@@ -114,8 +117,8 @@ public abstract class RuleManager { @@ -114,8 +117,8 @@ public abstract class RuleManager {
114 } 117 }
115 118
116 public RuleActorChain getRuleChain(ActorContext context) { 119 public RuleActorChain getRuleChain(ActorContext context) {
117 - if (ruleMap == null) {  
118 - init(context); 120 + if (ruleChain == null) {
  121 + doInit(context);
119 } 122 }
120 return ruleChain; 123 return ruleChain;
121 } 124 }
@@ -28,6 +28,7 @@ public class TenantRuleManager extends RuleManager { @@ -28,6 +28,7 @@ public class TenantRuleManager extends RuleManager {
28 super(systemContext, tenantId); 28 super(systemContext, tenantId);
29 } 29 }
30 30
  31 + @Override
31 public void init(ActorContext context) { 32 public void init(ActorContext context) {
32 if (systemContext.isTenantComponentsInitEnabled()) { 33 if (systemContext.isTenantComponentsInitEnabled()) {
33 super.init(context); 34 super.init(context);
@@ -151,7 +151,8 @@ public class TenantActor extends ContextAwareActor { @@ -151,7 +151,8 @@ public class TenantActor extends ContextAwareActor {
151 private void process(RuleChainDeviceMsg msg) { 151 private void process(RuleChainDeviceMsg msg) {
152 ToDeviceActorMsg toDeviceActorMsg = msg.getToDeviceActorMsg(); 152 ToDeviceActorMsg toDeviceActorMsg = msg.getToDeviceActorMsg();
153 ActorRef deviceActor = getOrCreateDeviceActor(toDeviceActorMsg.getDeviceId()); 153 ActorRef deviceActor = getOrCreateDeviceActor(toDeviceActorMsg.getDeviceId());
154 - RuleActorChain chain = new ComplexRuleActorChain(msg.getRuleChain(), ruleManager.getRuleChain(this.context())); 154 + RuleActorChain tenantChain = ruleManager.getRuleChain(this.context());
  155 + RuleActorChain chain = new ComplexRuleActorChain(msg.getRuleChain(), tenantChain);
155 deviceActor.tell(new RuleChainDeviceMsg(toDeviceActorMsg, chain), context().self()); 156 deviceActor.tell(new RuleChainDeviceMsg(toDeviceActorMsg, chain), context().self());
156 } 157 }
157 158