Przeglądaj źródła

优化ddl逻辑

zhou-hao 3 lat temu
rodzic
commit
a5a82fc130

+ 26 - 23
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/AutoDDLProcessor.java

@@ -57,33 +57,36 @@ public class AutoDDLProcessor implements InitializingBean {
         List<Class> entities = this.entities.stream().map(EntityInfo::getRealType).collect(Collectors.toList());
         if (properties.isAutoDdl()) {
             //加载全部表信息
-//            if (reactive) {
-//                Flux.fromIterable(entities)
-//                        .doOnNext(type -> log.info("auto ddl for {}", type))
-//                        .map(resolver::resolve)
-//                        .flatMap(meta->operator.ddl()
-//                                .createOrAlter(meta)
-//                                .commit()
-//                                .reactive())
-//                        .doOnError((err) -> log.error(err.getMessage(), err))
-//                        .then()
-//                        .toFuture().get(2, TimeUnit.MINUTES);
-//
-//            } else {
-            for (Class<?> entity : entities) {
-                log.trace("auto ddl for {}", entity);
-                try {
-                    operator.ddl()
-                            .createOrAlter(resolver.resolve(entity))
+            if (reactive) {
+                Flux.fromIterable(entities)
+                    .doOnNext(type -> log.trace("auto ddl for {}", type))
+                    .map(resolver::resolve)
+                    .flatMap(meta -> operator
+                            .ddl()
+                            .createOrAlter(meta)
                             .autoLoad(false)
                             .commit()
-                            .sync();
-                } catch (Exception e) {
-                    log.error(e.getMessage(), e);
-                    throw e;
+                            .reactive()
+                            .subscribeOn(Schedulers.elastic())
+                    )
+                    .doOnError((err) -> log.error(err.getMessage(), err))
+                    .then()
+                    .block(Duration.ofMinutes(5));
+            } else {
+                for (Class<?> entity : entities) {
+                    log.trace("auto ddl for {}", entity);
+                    try {
+                        operator.ddl()
+                                .createOrAlter(resolver.resolve(entity))
+                                .autoLoad(false)
+                                .commit()
+                                .sync();
+                    } catch (Exception e) {
+                        log.error(e.getMessage(), e);
+                        throw e;
+                    }
                 }
             }
-//            }
         } else {
             for (Class<?> entity : entities) {
                 RDBTableMetadata metadata = resolver.resolve(entity);

+ 3 - 1
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EasyormConfiguration.java

@@ -34,6 +34,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
+import java.time.Duration;
 import java.util.List;
 import java.util.Optional;
 
@@ -108,7 +109,8 @@ public class EasyormConfiguration {
         reactiveSqlExecutor.ifPresent(metadata::addFeature);
         if (properties.isAutoDdl()) {
             for (RDBSchemaMetadata schema : metadata.getSchemas()) {
-                schema.loadAllTable();
+                schema.loadAllTableReactive()
+                      .block(Duration.ofSeconds(30));
             }
         }
         return metadata;

+ 19 - 14
hsweb-commons/hsweb-commons-crud/src/main/java/org/hswebframework/web/crud/configuration/EasyormRepositoryRegistrar.java

@@ -28,6 +28,7 @@ import org.springframework.core.type.classreading.SimpleMetadataReaderFactory;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -145,23 +146,27 @@ public class EasyormRepositoryRegistrar implements ImportBeanDefinitionRegistrar
 
         }
 
-
-        try {
-            BeanDefinition definition = registry.getBeanDefinition(AutoDDLProcessor.class.getName());
-            Set<EntityInfo> infos = (Set) definition.getPropertyValues().get("entities");
-            infos.addAll(entityInfos);
-        } catch (NoSuchBeanDefinitionException e) {
-            RootBeanDefinition definition = new RootBeanDefinition();
-            definition.setTargetType(AutoDDLProcessor.class);
-            definition.setBeanClass(AutoDDLProcessor.class);
-            definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
-            definition.getPropertyValues().add("entities", entityInfos);
-            definition.getPropertyValues().add("reactive", reactive);
-            registry.registerBeanDefinition(AutoDDLProcessor.class.getName(), definition);
-        }
+        RootBeanDefinition definition = new RootBeanDefinition();
+        definition.setTargetType(AutoDDLProcessor.class);
+        definition.setBeanClass(AutoDDLProcessor.class);
+        definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
+        definition.getPropertyValues().add("entities", entityInfos);
+        definition.getPropertyValues().add("reactive", reactive);
+        definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
+        definition.setSynthetic(true);
+        registry.registerBeanDefinition(AutoDDLProcessor.class.getName() + "_" + count.incrementAndGet(), definition);
+
+//        try {
+//            BeanDefinition definition = registry.getBeanDefinition(AutoDDLProcessor.class.getName());
+//            Set<EntityInfo> infos = (Set) definition.getPropertyValues().get("entities");
+//            infos.addAll(entityInfos);
+//        } catch (NoSuchBeanDefinitionException e) {
+//
+//        }
 
 
     }
 
+    static AtomicInteger count = new AtomicInteger();
 
 }