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/21 07:29:15 UTC

[shardingsphere-elasticjob] branch master updated: Refactor elasticjob-lite-spring-boot-starter configuration structure (#1217)

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 8921433  Refactor elasticjob-lite-spring-boot-starter configuration structure (#1217)
8921433 is described below

commit 892143330c6a141e4642ebabcb4b9f06c87f49b2
Author: 吴伟杰 <ro...@me.com>
AuthorDate: Tue Jul 21 15:29:08 2020 +0800

    Refactor elasticjob-lite-spring-boot-starter configuration structure (#1217)
    
    - Reducing configuration levels.
---
 .../job/ElasticJobConfigurationProperties.java     | 85 +++++++++++++++++++++
 .../boot/job/ElasticJobLiteAutoConfiguration.java  | 86 ++++++++++++----------
 .../lite/spring/boot/job/ElasticJobProperties.java |  8 +-
 .../spring/boot/job/ElasticJobSpringBootTest.java  |  4 +-
 .../src/test/resources/application-elasticjob.yml  | 18 ++---
 5 files changed, 144 insertions(+), 57 deletions(-)

diff --git a/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobConfigurationProperties.java b/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobConfigurationProperties.java
new file mode 100644
index 0000000..1f22aa5
--- /dev/null
+++ b/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobConfigurationProperties.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.elasticjob.lite.spring.boot.job;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.shardingsphere.elasticjob.api.ElasticJob;
+import org.apache.shardingsphere.elasticjob.api.JobConfiguration;
+
+import java.util.Properties;
+
+@Getter
+@Setter
+public class ElasticJobConfigurationProperties {
+
+    private Class<? extends ElasticJob> elasticJobClass;
+
+    private String elasticJobType;
+
+    private String cron;
+
+    private int shardingTotalCount;
+
+    private String shardingItemParameters;
+
+    private String jobParameter;
+
+    private boolean monitorExecution;
+
+    private boolean failover;
+
+    private boolean misfire;
+
+    private int maxTimeDiffSeconds = -1;
+
+    private int reconcileIntervalMinutes;
+
+    private String jobShardingStrategyType;
+
+    private String jobExecutorServiceHandlerType;
+
+    private String jobErrorHandlerType;
+
+    private String description;
+
+    private Properties props = new Properties();
+
+    private boolean disabled;
+
+    private boolean overwrite;
+
+    /**
+     * Convert to job configuration.
+     *
+     * @param jobName job name
+     * @return job configuration
+     */
+    public JobConfiguration toJobConfiguration(final String jobName) {
+        JobConfiguration result = JobConfiguration.newBuilder(jobName, shardingTotalCount)
+                .cron(cron).shardingItemParameters(shardingItemParameters).jobParameter(jobParameter)
+                .monitorExecution(monitorExecution).failover(failover).misfire(misfire)
+                .maxTimeDiffSeconds(maxTimeDiffSeconds).reconcileIntervalMinutes(reconcileIntervalMinutes)
+                .jobShardingStrategyType(jobShardingStrategyType).jobExecutorServiceHandlerType(jobExecutorServiceHandlerType).jobErrorHandlerType(jobErrorHandlerType)
+                .description(description).disabled(disabled).overwrite(overwrite).build();
+        for (Object each : props.keySet()) {
+            result.getProps().setProperty(each.toString(), props.get(each.toString()).toString());
+        }
+        return result;
+    }
+}
diff --git a/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobLiteAutoConfiguration.java b/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobLiteAutoConfiguration.java
index 8a34da6..6787535 100644
--- a/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobLiteAutoConfiguration.java
+++ b/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobLiteAutoConfiguration.java
@@ -17,13 +17,13 @@
 
 package org.apache.shardingsphere.elasticjob.lite.spring.boot.job;
 
+import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 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;
 import org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.ScheduleJobBootstrap;
-import org.apache.shardingsphere.elasticjob.infra.pojo.JobConfigurationPOJO;
 import org.apache.shardingsphere.elasticjob.lite.spring.boot.reg.ElasticJobRegistryCenterConfiguration;
 import org.apache.shardingsphere.elasticjob.lite.spring.boot.tracing.ElasticJobTracingConfiguration;
 import org.apache.shardingsphere.elasticjob.reg.base.CoordinatorRegistryCenter;
@@ -41,7 +41,6 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Import;
 
 import javax.annotation.PostConstruct;
-import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -57,23 +56,19 @@ import java.util.Map.Entry;
 public class ElasticJobLiteAutoConfiguration implements ApplicationContextAware {
     
     private ApplicationContext applicationContext;
-    
+
     /**
-     * Create job bootstrap instances.
-     *
-     * @throws ClassNotFoundException if the class configured under classed jobs not found
+     * Create job bootstrap instances and register them into container.
      */
     @PostConstruct
-    public void createJobBootstrapBeans() throws ClassNotFoundException {
+    public void createJobBootstrapBeans() {
         ElasticJobProperties elasticJobProperties = applicationContext.getBean(ElasticJobProperties.class);
-        // TODO Looking for a better way
-        SingletonBeanRegistry beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory();
+        SingletonBeanRegistry singletonBeanRegistry = ((ConfigurableApplicationContext) applicationContext).getBeanFactory();
         CoordinatorRegistryCenter registryCenter = applicationContext.getBean(CoordinatorRegistryCenter.class);
         TracingConfiguration tracingConfiguration = getTracingConfiguration();
-        registerClassedJobs(elasticJobProperties, beanFactory, registryCenter, tracingConfiguration);
-        registerTypedJobs(elasticJobProperties, beanFactory, registryCenter, tracingConfiguration);
+        constructJobBootstraps(elasticJobProperties, singletonBeanRegistry, registryCenter, tracingConfiguration);
     }
-    
+
     private TracingConfiguration getTracingConfiguration() {
         Map<String, TracingConfiguration> tracingConfigurationBeans = applicationContext.getBeansOfType(TracingConfiguration.class);
         if (tracingConfigurationBeans.isEmpty()) {
@@ -86,36 +81,49 @@ public class ElasticJobLiteAutoConfiguration implements ApplicationContextAware
                 "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() + "ScheduleJobBootstrap", new ScheduleJobBootstrap(registryCenter, elasticJob, jobConfiguration, tracingConfiguration));
-                }
+
+    private void constructJobBootstraps(final ElasticJobProperties elasticJobProperties, final SingletonBeanRegistry singletonBeanRegistry,
+                                        final CoordinatorRegistryCenter registryCenter, final TracingConfiguration tracingConfiguration) {
+        for (Entry<String, ElasticJobConfigurationProperties> entry : elasticJobProperties.getJobs().entrySet()) {
+            ElasticJobConfigurationProperties jobConfigurationProperties = entry.getValue();
+            Preconditions.checkArgument(null != jobConfigurationProperties.getElasticJobClass()
+                            || !Strings.isNullOrEmpty(jobConfigurationProperties.getElasticJobType()),
+                    "Please specific [elasticJobClass] or [elasticJobType] under job configuration.");
+            Preconditions.checkArgument(null == jobConfigurationProperties.getElasticJobClass()
+                            || Strings.isNullOrEmpty(jobConfigurationProperties.getElasticJobType()),
+                    "[elasticJobClass] and [elasticJobType] are mutually exclusive.");
+            if (null != jobConfigurationProperties.getElasticJobClass()) {
+                registerClassedJob(entry.getKey(), singletonBeanRegistry, registryCenter, tracingConfiguration, jobConfigurationProperties);
+            } else if (!Strings.isNullOrEmpty(jobConfigurationProperties.getElasticJobType())) {
+                registerTypedJob(entry.getKey(), singletonBeanRegistry, registryCenter, tracingConfiguration, jobConfigurationProperties);
             }
         }
     }
-    
-    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() + "OneOffJobBootstrap", new OneOffJobBootstrap(registryCenter, entry.getKey(), jobConfiguration, tracingConfiguration));
-                } else {
-                    beanFactory.registerSingleton(
-                            jobConfiguration.getJobName() + "ScheduleJobBootstrap", new ScheduleJobBootstrap(registryCenter, entry.getKey(), jobConfiguration, tracingConfiguration));
-                }
-            }
+
+    private void registerClassedJob(final String jobName, final SingletonBeanRegistry singletonBeanRegistry, final CoordinatorRegistryCenter registryCenter,
+                                    final TracingConfiguration tracingConfiguration, final ElasticJobConfigurationProperties jobConfigurationProperties) {
+        JobConfiguration jobConfiguration = jobConfigurationProperties.toJobConfiguration(jobName);
+        ElasticJob elasticJob = applicationContext.getBean(jobConfigurationProperties.getElasticJobClass());
+        if (Strings.isNullOrEmpty(jobConfiguration.getCron())) {
+            singletonBeanRegistry.registerSingleton(jobConfiguration.getJobName() + "OneOffJobBootstrap",
+                    new OneOffJobBootstrap(registryCenter, elasticJob, jobConfiguration, tracingConfiguration));
+        } else {
+            singletonBeanRegistry.registerSingleton(jobConfiguration.getJobName() + "ScheduleJobBootstrap",
+                    new ScheduleJobBootstrap(registryCenter, elasticJob, jobConfiguration, tracingConfiguration));
+        }
+    }
+
+    private void registerTypedJob(final String jobName, final SingletonBeanRegistry singletonBeanRegistry, final CoordinatorRegistryCenter registryCenter,
+                                  final TracingConfiguration tracingConfiguration, final ElasticJobConfigurationProperties jobConfigurationProperties) {
+        JobConfiguration jobConfiguration = jobConfigurationProperties.toJobConfiguration(jobName);
+        if (Strings.isNullOrEmpty(jobConfiguration.getCron())) {
+            singletonBeanRegistry.registerSingleton(
+                    jobConfiguration.getJobName() + "OneOffJobBootstrap",
+                    new OneOffJobBootstrap(registryCenter, jobConfigurationProperties.getElasticJobType(), jobConfiguration, tracingConfiguration));
+        } else {
+            singletonBeanRegistry.registerSingleton(
+                    jobConfiguration.getJobName() + "ScheduleJobBootstrap",
+                    new ScheduleJobBootstrap(registryCenter, jobConfigurationProperties.getElasticJobType(), jobConfiguration, tracingConfiguration));
         }
     }
 }
diff --git a/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobProperties.java b/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobProperties.java
index f5e2a3e..82254d2 100644
--- a/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobProperties.java
+++ b/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/main/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobProperties.java
@@ -19,11 +19,9 @@ package org.apache.shardingsphere.elasticjob.lite.spring.boot.job;
 
 import lombok.Getter;
 import lombok.Setter;
-import org.apache.shardingsphere.elasticjob.infra.pojo.JobConfigurationPOJO;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 
 import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
 
 /**
@@ -31,10 +29,8 @@ import java.util.Map;
  */
 @Getter
 @Setter
-@ConfigurationProperties(prefix = "elasticjob.jobs")
+@ConfigurationProperties(prefix = "elasticjob")
 public class ElasticJobProperties {
 
-    private Map<String, List<JobConfigurationPOJO>> typed = new LinkedHashMap<>();
-
-    private Map<String, List<JobConfigurationPOJO>> classed = new LinkedHashMap<>();
+    private Map<String, ElasticJobConfigurationProperties> jobs = new LinkedHashMap<>();
 }
diff --git a/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/test/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobSpringBootTest.java b/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/test/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobSpringBootTest.java
index 12a8703..30b04ec 100644
--- a/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/test/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobSpringBootTest.java
+++ b/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/test/java/org/apache/shardingsphere/elasticjob/lite/spring/boot/job/ElasticJobSpringBootTest.java
@@ -19,7 +19,7 @@ package org.apache.shardingsphere.elasticjob.lite.spring.boot.job;
 
 import org.apache.shardingsphere.elasticjob.api.ElasticJob;
 import org.apache.shardingsphere.elasticjob.infra.concurrent.BlockUtils;
-import org.apache.shardingsphere.elasticjob.lite.api.bootstrap.impl.OneOffJobBootstrap;
+import org.apache.shardingsphere.elasticjob.lite.api.bootstrap.JobBootstrap;
 import org.apache.shardingsphere.elasticjob.lite.spring.boot.job.fixture.EmbedTestingServer;
 import org.apache.shardingsphere.elasticjob.lite.spring.boot.reg.ZookeeperProperties;
 import org.apache.shardingsphere.elasticjob.reg.zookeeper.ZookeeperRegistryCenter;
@@ -83,7 +83,7 @@ public class ElasticJobSpringBootTest extends AbstractJUnit4SpringContextTests {
         assertNotNull(applicationContext);
         Map<String, ElasticJob> elasticJobBeans = applicationContext.getBeansOfType(ElasticJob.class);
         assertFalse(elasticJobBeans.isEmpty());
-        Map<String, OneOffJobBootstrap> jobBootstrapBeans = applicationContext.getBeansOfType(OneOffJobBootstrap.class);
+        Map<String, JobBootstrap> jobBootstrapBeans = applicationContext.getBeansOfType(JobBootstrap.class);
         assertFalse(jobBootstrapBeans.isEmpty());
         BlockUtils.waitingShortTime();
     }
diff --git a/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/test/resources/application-elasticjob.yml b/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/test/resources/application-elasticjob.yml
index 5d0da31..00be00f 100644
--- a/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/test/resources/application-elasticjob.yml
+++ b/elasticjob-lite/elasticjob-lite-spring/elasticjob-lite-spring-boot-starter/src/test/resources/application-elasticjob.yml
@@ -29,13 +29,11 @@ elasticjob:
     serverLists: localhost:18181
     namespace: elasticjob-lite-spring-boot-starter
   jobs:
-    classed:
-      org.apache.shardingsphere.elasticjob.lite.spring.boot.job.fixture.job.impl.CustomTestJob:
-        - jobName: customTestJob
-          shardingTotalCount: 3
-    typed:
-      PRINT:
-        - jobName: printTestJob
-          shardingTotalCount: 3
-          props:
-            print.content: "test print job"
+    customTestJob:
+      elasticJobClass: org.apache.shardingsphere.elasticjob.lite.spring.boot.job.fixture.job.impl.CustomTestJob
+      shardingTotalCount: 3
+    printTestJob:
+      elasticJobType: PRINT
+      shardingTotalCount: 3
+      props:
+        print.content: "test print job"