You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2020/07/15 03:26:43 UTC

[shardingsphere-elasticjob] branch master updated: Add setDestroyMethodName for reg spring namespace (#1065)

This is an automated email from the ASF dual-hosted git repository.

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere-elasticjob.git


The following commit(s) were added to refs/heads/master by this push:
     new bfb66ff  Add setDestroyMethodName for reg spring namespace (#1065)
bfb66ff is described below

commit bfb66ff541a04532e45886f87c85058d957b847c
Author: Liang Zhang <te...@163.com>
AuthorDate: Wed Jul 15 11:26:31 2020 +0800

    Add setDestroyMethodName for reg spring namespace (#1065)
    
    * Add setDestroyMethodName for reg spring namespace
    
    * Add todo
    
    * Refactor ElasticJobLiteAutoConfiguration
---
 .../lite/boot/ElasticJobLiteAutoConfiguration.java | 101 ++++++++++-----------
 .../lite/boot/ElasticJobStartupRunner.java         |  28 +++---
 .../reg/parser/ZookeeperBeanDefinitionParser.java  |   1 +
 3 files changed, 59 insertions(+), 71 deletions(-)

diff --git a/elasticjob-lite/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/boot/ElasticJobLiteAutoConfiguration.java b/elasticjob-lite/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/boot/ElasticJobLiteAutoConfiguration.java
index 9ed7a2d..a927d01 100644
--- a/elasticjob-lite/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/boot/ElasticJobLiteAutoConfiguration.java
+++ b/elasticjob-lite/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/boot/ElasticJobLiteAutoConfiguration.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.elasticjob.lite.boot;
 
+import lombok.Setter;
 import org.apache.shardingsphere.elasticjob.api.ElasticJob;
 import org.apache.shardingsphere.elasticjob.api.JobConfiguration;
 import org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.OneOffJobBootstrap;
@@ -26,7 +27,6 @@ import org.apache.shardingsphere.elasticjob.reg.base.CoordinatorRegistryCenter;
 import org.apache.shardingsphere.elasticjob.reg.boot.ElasticJobRegistryCenterAutoConfiguration;
 import org.apache.shardingsphere.elasticjob.tracing.api.TracingConfiguration;
 import org.assertj.core.util.Strings;
-import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.BeanCreationException;
 import org.springframework.beans.factory.config.SingletonBeanRegistry;
 import org.springframework.boot.autoconfigure.AutoConfigureAfter;
@@ -41,81 +41,74 @@ import org.springframework.context.annotation.Import;
 import javax.annotation.PostConstruct;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 @Configuration
 @AutoConfigureAfter(ElasticJobRegistryCenterAutoConfiguration.class)
 @ConditionalOnProperty(name = "elasticjob.enabled", havingValue = "true", matchIfMissing = true)
 @Import(ElasticJobStartupRunner.class)
 @EnableConfigurationProperties(ElasticJobProperties.class)
+@Setter
 public class ElasticJobLiteAutoConfiguration implements ApplicationContextAware {
-
+    
     private ApplicationContext applicationContext;
-
-    @Override
-    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {
-        this.applicationContext = applicationContext;
-    }
-
+    
     /**
-     * Create JobBootstrap instances.
+     * Create job bootstrap instances.
      *
-     * @throws ClassNotFoundException if the Class configured under classed jobs not found
+     * @throws ClassNotFoundException if the class configured under classed jobs not found
      */
     @PostConstruct
     public void createJobBootstrapBeans() throws ClassNotFoundException {
-        ElasticJobProperties elasticJobProperties = this.applicationContext.getBean(ElasticJobProperties.class);
-
-        // Looking for a better way
-        final SingletonBeanRegistry beanFactory = ((ConfigurableApplicationContext) this.applicationContext).getBeanFactory();
-
-        final CoordinatorRegistryCenter registryCenter = this.applicationContext.getBean(CoordinatorRegistryCenter.class);
-        TracingConfiguration<?> tracingConfiguration = null;
-        Map<String, TracingConfiguration> tracingConfigurationBeans = this.applicationContext.getBeansOfType(TracingConfiguration.class);
-        if (tracingConfigurationBeans.size() == 1) {
-            tracingConfiguration = tracingConfigurationBeans.values().stream().findAny().orElse(null);
-        } else if (tracingConfigurationBeans.size() > 1) {
-            throw new BeanCreationException(
-                    "More than one [org.apache.shardingsphere.elasticjob.tracing.api.TracingConfiguration] beans found. "
-                            + "Consider disabling [org.apache.shardingsphere.elasticjob.tracing.boot.ElasticjobTracingAutoConfiguration].");
+        ElasticJobProperties elasticJobProperties = applicationContext.getBean(ElasticJobProperties.class);
+        // TODO Looking for a better way
+        SingletonBeanRegistry beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory();
+        CoordinatorRegistryCenter registryCenter = applicationContext.getBean(CoordinatorRegistryCenter.class);
+        TracingConfiguration tracingConfiguration = getTracingConfiguration();
+        registerClassedJobs(elasticJobProperties, beanFactory, registryCenter, tracingConfiguration);
+        registerTypedJobs(elasticJobProperties, beanFactory, registryCenter, tracingConfiguration);
+    }
+    
+    private TracingConfiguration getTracingConfiguration() {
+        Map<String, TracingConfiguration> tracingConfigurationBeans = applicationContext.getBeansOfType(TracingConfiguration.class);
+        if (tracingConfigurationBeans.isEmpty()) {
+            return null;
         }
-
-        for (String elasticJobClassName : elasticJobProperties.getClassed().keySet()) {
-            List<JobConfigurationPOJO> jobConfigurationPojoList = elasticJobProperties.getClassed().get(elasticJobClassName);
-            for (JobConfigurationPOJO jobConfigurationPojo : jobConfigurationPojoList) {
-                JobConfiguration jobConfiguration = jobConfigurationPojo.toJobConfiguration();
-                ElasticJob elasticJob = (ElasticJob) applicationContext.getBean(
-                        Thread.currentThread().getContextClassLoader().loadClass(elasticJobClassName));
-                if (!Strings.isNullOrEmpty(jobConfiguration.getCron())) {
-                    beanFactory.registerSingleton(
-                            jobConfiguration.getJobName() + "ScheduleJobBootstrap",
-                            new ScheduleJobBootstrap(registryCenter,
-                                    elasticJob,
-                                    jobConfiguration, tracingConfiguration));
+        if (1 == tracingConfigurationBeans.size()) {
+            return tracingConfigurationBeans.values().iterator().next();
+        }
+        throw new BeanCreationException(
+                "More than one [org.apache.shardingsphere.elasticjob.tracing.api.TracingConfiguration] beans found. "
+                        + "Consider disabling [org.apache.shardingsphere.elasticjob.tracing.boot.ElasticjobTracingAutoConfiguration].");
+    }
+    
+    private void registerClassedJobs(final ElasticJobProperties elasticJobProperties, final SingletonBeanRegistry beanFactory,
+                                     final CoordinatorRegistryCenter registryCenter, final TracingConfiguration tracingConfiguration) throws ClassNotFoundException {
+        for (Entry<String, List<JobConfigurationPOJO>> entry : elasticJobProperties.getClassed().entrySet()) {
+            for (JobConfigurationPOJO each : entry.getValue()) {
+                JobConfiguration jobConfiguration = each.toJobConfiguration();
+                ElasticJob elasticJob = (ElasticJob) applicationContext.getBean(Thread.currentThread().getContextClassLoader().loadClass(entry.getKey()));
+                if (Strings.isNullOrEmpty(jobConfiguration.getCron())) {
+                    beanFactory.registerSingleton(jobConfiguration.getJobName() + "OneOffJobBootstrap", new OneOffJobBootstrap(registryCenter, elasticJob, jobConfiguration, tracingConfiguration));
                 } else {
                     beanFactory.registerSingleton(
-                            jobConfiguration.getJobName() + "OneOffJobBootstrap",
-                            new OneOffJobBootstrap(registryCenter,
-                                    elasticJob,
-                                    jobConfiguration, tracingConfiguration));
+                            jobConfiguration.getJobName() + "ScheduleJobBootstrap", new ScheduleJobBootstrap(registryCenter, elasticJob, jobConfiguration, tracingConfiguration));
                 }
             }
         }
-        for (String elasticJobType : elasticJobProperties.getTyped().keySet()) {
-            List<JobConfigurationPOJO> jobConfigurationPojoList = elasticJobProperties.getTyped().get(elasticJobType);
-            for (JobConfigurationPOJO jobConfigurationPojo : jobConfigurationPojoList) {
-                JobConfiguration jobConfiguration = jobConfigurationPojo.toJobConfiguration();
-                if (!Strings.isNullOrEmpty(jobConfiguration.getCron())) {
+    }
+    
+    private void registerTypedJobs(final ElasticJobProperties elasticJobProperties, final SingletonBeanRegistry beanFactory, 
+                                   final CoordinatorRegistryCenter registryCenter, final TracingConfiguration tracingConfiguration) {
+        for (Entry<String, List<JobConfigurationPOJO>> entry : elasticJobProperties.getTyped().entrySet()) {
+            for (JobConfigurationPOJO each : entry.getValue()) {
+                JobConfiguration jobConfiguration = each.toJobConfiguration();
+                if (Strings.isNullOrEmpty(jobConfiguration.getCron())) {
                     beanFactory.registerSingleton(
-                            jobConfiguration.getJobName() + "ScheduleJobBootstrap",
-                            new ScheduleJobBootstrap(registryCenter,
-                                    elasticJobType,
-                                    jobConfiguration, tracingConfiguration));
+                            jobConfiguration.getJobName() + "OneOffJobBootstrap", new OneOffJobBootstrap(registryCenter, entry.getKey(), jobConfiguration, tracingConfiguration));
                 } else {
                     beanFactory.registerSingleton(
-                            jobConfiguration.getJobName() + "OneOffJobBootstrap",
-                            new OneOffJobBootstrap(registryCenter,
-                                    elasticJobType,
-                                    jobConfiguration, tracingConfiguration));
+                            jobConfiguration.getJobName() + "ScheduleJobBootstrap", new ScheduleJobBootstrap(registryCenter, entry.getKey(), jobConfiguration, tracingConfiguration));
                 }
             }
         }
diff --git a/elasticjob-lite/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/boot/ElasticJobStartupRunner.java b/elasticjob-lite/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/boot/ElasticJobStartupRunner.java
index 7991a63..b856ff7 100644
--- a/elasticjob-lite/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/boot/ElasticJobStartupRunner.java
+++ b/elasticjob-lite/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/boot/ElasticJobStartupRunner.java
@@ -17,31 +17,25 @@
 
 package org.apache.shardingsphere.elasticjob.lite.boot;
 
+import lombok.Setter;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.OneOffJobBootstrap;
 import org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.ScheduleJobBootstrap;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeansException;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 
+@Setter
+@Slf4j
 public class ElasticJobStartupRunner implements CommandLineRunner, ApplicationContextAware {
-
-    private final Logger logger = LoggerFactory.getLogger(ElasticJobStartupRunner.class);
-
+    
     private ApplicationContext applicationContext;
-
-    @Override
-    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {
-        this.applicationContext = applicationContext;
-    }
-
+    
     @Override
-    public void run(final String... args) throws Exception {
-        logger.info("Starting ElasticJob Bootstrap.");
-        this.applicationContext.getBeansOfType(ScheduleJobBootstrap.class).values().forEach(ScheduleJobBootstrap::schedule);
-        this.applicationContext.getBeansOfType(OneOffJobBootstrap.class).values().forEach(OneOffJobBootstrap::execute);
-        logger.info("ElasticJob Bootstrap started.");
+    public void run(final String... args) {
+        log.info("Starting ElasticJob Bootstrap.");
+        applicationContext.getBeansOfType(ScheduleJobBootstrap.class).values().forEach(ScheduleJobBootstrap::schedule);
+        applicationContext.getBeansOfType(OneOffJobBootstrap.class).values().forEach(OneOffJobBootstrap::execute);
+        log.info("ElasticJob Bootstrap started.");
     }
 }
diff --git a/elasticjob-lite/elasticjob-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/reg/parser/ZookeeperBeanDefinitionParser.java b/elasticjob-lite/elasticjob-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/reg/parser/ZookeeperBeanDefinitionParser.java
index 3ac5ccd..6fd5077 100644
--- a/elasticjob-lite/elasticjob-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/reg/parser/ZookeeperBeanDefinitionParser.java
+++ b/elasticjob-lite/elasticjob-lite-spring/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/reg/parser/ZookeeperBeanDefinitionParser.java
@@ -37,6 +37,7 @@ public final class ZookeeperBeanDefinitionParser extends AbstractBeanDefinitionP
         BeanDefinitionBuilder result = BeanDefinitionBuilder.rootBeanDefinition(ZookeeperRegistryCenter.class);
         result.addConstructorArgValue(buildZookeeperConfigurationBeanDefinition(element));
         result.setInitMethodName("init");
+        result.setDestroyMethodName("close");
         return result.getBeanDefinition();
     }