From add0a342c4540ae6f678134d3dc21801b46581d0 Mon Sep 17 00:00:00 2001 From: Sergey Matvienko Date: Fri, 10 Mar 2023 16:20:21 +0100 Subject: [PATCH] EntityRegistryService: PostConstrust replaced with event listener ContextRefreshedEvent. This will guarantee that all EntityDaoService's beans created. Otherwise, the Bean may discover beans that not created yet (reproducible on dao tests) --- .../entity/DefaultEntityServiceRegistry.java | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/dao/src/main/java/org/thingsboard/server/dao/entity/DefaultEntityServiceRegistry.java b/dao/src/main/java/org/thingsboard/server/dao/entity/DefaultEntityServiceRegistry.java index a8b1d97bac..a752127f91 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/entity/DefaultEntityServiceRegistry.java +++ b/dao/src/main/java/org/thingsboard/server/dao/entity/DefaultEntityServiceRegistry.java @@ -15,27 +15,31 @@ */ package org.thingsboard.server.dao.entity; +import com.google.common.collect.MapMaker; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.context.event.EventListener; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; import org.springframework.stereotype.Service; import org.thingsboard.server.common.data.EntityType; -import javax.annotation.PostConstruct; -import java.util.HashMap; import java.util.Map; @Service +@RequiredArgsConstructor +@Slf4j public class DefaultEntityServiceRegistry implements EntityServiceRegistry { private final ApplicationContext applicationContext; - private final Map entityDaoServicesMap; + private final Map entityDaoServicesMap = new MapMaker().weakValues().makeMap(); - public DefaultEntityServiceRegistry(ApplicationContext applicationContext) { - this.applicationContext = applicationContext; - this.entityDaoServicesMap = new HashMap<>(); - } - - @PostConstruct + @EventListener(ContextRefreshedEvent.class) + @Order(Ordered.HIGHEST_PRECEDENCE) public void init() { + log.debug("Initializing EntityServiceRegistry on ContextRefreshedEvent"); applicationContext.getBeansOfType(EntityDaoService.class).values().forEach(entityDaoService -> { EntityType entityType = entityDaoService.getEntityType(); entityDaoServicesMap.put(entityType, entityDaoService); @@ -43,6 +47,7 @@ public class DefaultEntityServiceRegistry implements EntityServiceRegistry { entityDaoServicesMap.put(EntityType.RULE_NODE, entityDaoService); } }); + log.debug("Initialized EntityServiceRegistry total [{}] entries", entityDaoServicesMap.size()); } @Override