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"