From 2c06acc9962dee196431c0e9202775470837dded Mon Sep 17 00:00:00 2001
From: xiaolongzuo <150349407@qq.com>
Date: Fri, 14 Dec 2018 18:34:43 +0800
Subject: [PATCH] Add SchedulerX module for branch 1.x.
---
pom.xml | 1 +
spring-cloud-alibaba-dependencies/pom.xml | 19 ++-
.../src/main/asciidoc-zh/schedulerx.adoc | 131 ++++++++++++++++++
.../asciidoc-zh/spring-cloud-alibaba.adoc | 1 +
.../src/main/asciidoc/schedulerx.adoc | 0
.../main/asciidoc/spring-cloud-alibaba.adoc | 1 +
spring-cloud-alibaba-examples/pom.xml | 1 +
.../schedulerx-simple-task-example/pom.xml | 37 +++++
.../readme-zh.md | 47 +++++++
.../cloud/examples/ScxApplication.java | 32 +++++
.../alibaba/cloud/examples/SimpleTask.java | 35 +++++
.../src/main/resources/application.properties | 3 +
spring-cloud-alicloud-context/pom.xml | 6 +
.../nacos/NacosParameterInitListener.java | 7 +-
.../scx/ScxContextAutoConfiguration.java | 71 ++++++++++
.../alicloud/context/scx/ScxProperties.java | 51 +++++++
.../statistics/StatisticsTaskStarter.java | 108 +++++++++++++++
.../main/resources/META-INF/spring.factories | 4 +-
.../AliCloudSpringApplicationTests.java | 4 +-
.../context/scx/ScxPropertiesLoadTests.java | 50 +++++++
.../alicloud/scx/ScxAutoConfiguration.java | 23 +++
spring-cloud-alicloud-schedulerx/pom.xml | 48 +++++++
.../alicloud/scx/ScxAutoConfiguration.java | 29 ++++
.../alicloud/scx/endpoint/ScxEndpoint.java | 58 ++++++++
.../ScxEndpointAutoConfiguration.java | 37 +++++
.../main/resources/META-INF/spring.factories | 3 +
spring-cloud-starter-alicloud/pom.xml | 3 +-
.../pom.xml | 20 +++
28 files changed, 823 insertions(+), 7 deletions(-)
create mode 100644 spring-cloud-alibaba-docs/src/main/asciidoc-zh/schedulerx.adoc
create mode 100644 spring-cloud-alibaba-docs/src/main/asciidoc/schedulerx.adoc
create mode 100644 spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/pom.xml
create mode 100644 spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/readme-zh.md
create mode 100644 spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/ScxApplication.java
create mode 100644 spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/SimpleTask.java
create mode 100644 spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/resources/application.properties
create mode 100644 spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/scx/ScxContextAutoConfiguration.java
create mode 100644 spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/scx/ScxProperties.java
create mode 100644 spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/statistics/StatisticsTaskStarter.java
create mode 100644 spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/scx/ScxPropertiesLoadTests.java
create mode 100644 spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/scx/ScxAutoConfiguration.java
create mode 100644 spring-cloud-alicloud-schedulerx/pom.xml
create mode 100644 spring-cloud-alicloud-schedulerx/src/main/java/org/springframework/cloud/alicloud/scx/ScxAutoConfiguration.java
create mode 100644 spring-cloud-alicloud-schedulerx/src/main/java/org/springframework/cloud/alicloud/scx/endpoint/ScxEndpoint.java
create mode 100644 spring-cloud-alicloud-schedulerx/src/main/java/org/springframework/cloud/alicloud/scx/endpoint/ScxEndpointAutoConfiguration.java
create mode 100644 spring-cloud-alicloud-schedulerx/src/main/resources/META-INF/spring.factories
create mode 100644 spring-cloud-starter-alicloud/spring-cloud-starter-alicloud-schedulerx/pom.xml
diff --git a/pom.xml b/pom.xml
index 053e6e20..34abc02b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -90,6 +90,7 @@
spring-cloud-alicloud-context
spring-cloud-alicloud-acm
spring-cloud-alicloud-ans
+ spring-cloud-alicloud-schedulerx
diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml
index f438ccf0..cd17626b 100644
--- a/spring-cloud-alibaba-dependencies/pom.xml
+++ b/spring-cloud-alibaba-dependencies/pom.xml
@@ -22,9 +22,10 @@
1.0.8
0.1.1
4.0.1
- 1.0.0
+ 1.0.2
2.16.0
4.3.1
+ 2.1.6
@@ -61,6 +62,11 @@
acm-sdk
${acm.version}
+
+ com.alibaba.edas
+ schedulerX-client
+ ${schedulerX.client.version}
+
com.alibaba.nacos
nacos-client
@@ -172,6 +178,11 @@
spring-cloud-alicloud-ans
${project.version}
+
+ org.springframework.cloud
+ spring-cloud-alicloud-schedulerx
+ ${project.version}
+
org.springframework.cloud
spring-cloud-alicloud-context
@@ -219,6 +230,12 @@
${project.version}
+
+ org.springframework.cloud
+ spring-cloud-starter-alicloud-schedulerx
+ ${project.version}
+
+
org.springframework.cloud
spring-cloud-starter-stream-rocketmq
diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/schedulerx.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/schedulerx.adoc
new file mode 100644
index 00000000..0c33b407
--- /dev/null
+++ b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/schedulerx.adoc
@@ -0,0 +1,131 @@
+== Spring Cloud Alibaba Cloud SchedulerX
+
+SchedulerX(分布式任务调度) 是隶属于阿里云EDAS产品的组件, Spring Cloud AliCloud SchedulerX 提供了在Spring Cloud的配置规范下,分布式任务调度的功能支持。SchedulerX可提供秒级、精准、高可靠、高可用的定时任务调度服务,并支持多种类型的任务调度,如简单单机任务、简单多机任务、脚本任务以及网格任务。
+
+=== 如何引入 Spring Cloud AliCloud SchedulerX
+
+Spring Cloud Alibaba 已经发布了0.1.1版本,需要首先导入依赖管理POM。
+
+[source,xml]
+----
+
+
+
+ org.springframework.cloud
+ spring-cloud-alibaba-dependencies
+ 0.1.1.RELEASE
+ pom
+ import
+
+
+
+----
+
+接下来引入 Spring Cloud AliCloud SchedulerX Starter 即可。
+
+[source,xml]
+----
+
+ org.springframework.cloud
+ spring-cloud-starter-alicloud-schedulerX
+
+----
+
+=== 启动SchedulerX任务调度
+
+当客户端引入了 Spring Cloud AliCloud SchedulerX Starter 以后,只需要进行一些简单的配置,就可以自动初始化SchedulerX的任务调度服务。
+
+以下是一个简单的应用示例。
+
+[source,java]
+----
+@SpringBootApplication
+public class ScxApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ScxApplication.class, args);
+ }
+
+}
+----
+
+在application.properties中,需要加上以下配置。
+
+[source,properties]
+----
+server.port=18033
+# 其中cn-test是SchedulerX的测试区域
+spring.cloud.alicloud.scx.group-id=***
+spring.cloud.alicloud.edas.namespace=cn-test
+----
+
+在获取group-id之前,需要首先 https://account.aliyun.com/register/register.htm?spm=5176.8142029.388261.26.e9396d3eEIv28g&oauth_callback=https%3A%2F%2Fwww.aliyun.com%2F[注册阿里云账号] ,然后 https://common-buy.aliyun.com/?spm=5176.11451019.0.0.6f5965c0Uq5tue&commodityCode=edaspostpay#/buy[开通EDAS服务] ,并 https://edas.console.aliyun.com/#/edasTools[开通分布式任务管理组件] 。
+
+其中group-id的获取,请参考 https://help.aliyun.com/document_detail/98784.html?spm=a2c4g.11186623.2.17.23c87da9P2F3tG[这里]。
+
+NOTE: 在创建group的时候,要选择"测试"区域。
+
+=== 编写一个简单任务
+
+简单任务是最常用的任务类型,只需要实现 ScxSimpleJobProcessor 接口即可。
+
+以下是一个简单的单机类型任务示例。
+
+[source,java]
+----
+public class SimpleTask implements ScxSimpleJobProcessor {
+
+ @Override
+ public ProcessResult process(ScxSimpleJobContext context) {
+ System.out.println("-----------Hello world---------------");
+ ProcessResult processResult = new ProcessResult(true);
+ return processResult;
+ }
+
+}
+----
+
+=== 对任务进行调度
+
+进入 https://edas.console.aliyun.com/#/edasSchedulerXJob?regionNo=cn-test[SchedulerX任务列表] 页面,选择上方"测试"区域,点击右上角"新建Job",创建一个Job,即如下所示。
+
+[source,text]
+----
+Job分组:测试——***-*-*-****
+Job处理接口:org.springframework.cloud.alibaba.cloud.examples.SimpleTask
+类型:简单Job单机版
+定时表达式:默认选项——0 * * * * ?
+Job描述:无
+自定义参数:无
+----
+
+以上任务类型选择了"简单Job单机版",并且制定了Cron表达式为"0 * * * * ?",这意味着,每过一分钟,任务将会被执行且只执行一次。
+
+更多任务类型,请参考 https://help.aliyun.com/document_detail/43136.html[SchedulerX官方文档]。
+
+=== 生产环境使用
+
+以上使用的都是SchedulerX的"测试"区域,主要用于本地调试和测试。
+
+在生产级别,除了上面的group-id和namespace以外,还需要一些额外的配置,如下所示。
+
+[source,properties]
+----
+server.port=18033
+# 其中cn-test是SchedulerX的测试区域
+spring.cloud.alicloud.scx.group-id=***
+spring.cloud.alicloud.edas.namespace=***
+# 当应用运行在EDAS上时,以下配置不需要手动配置。
+spring.cloud.alicloud.access-key=***
+spring.cloud.alicloud.secret-key=***
+# 以下配置不是必须的,请参考SchedulerX文档
+spring.cloud.alicloud.scx.domain-name=***
+----
+
+其中group-id与之前的获取方式一样,namespace则是从EDAS控制台左侧"命名空间"列表中获取命名空间ID。
+
+NOTE: group-id必须创建在namespace当中。
+
+access-key以及secret-key为阿里云账号的AK/SK信息,如果应用在EDAS上部署,则不需要填写这两项信息,否则请前往 https://usercenter.console.aliyun.com/#/manage/ak[安全信息管理]获取。
+
+domain-name并不是必须的,具体请参考 https://help.aliyun.com/document_detail/35359.html[SchedulerX官方文档]。
diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/spring-cloud-alibaba.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/spring-cloud-alibaba.adoc
index 6a05ccde..5cde376e 100644
--- a/spring-cloud-alibaba-docs/src/main/asciidoc-zh/spring-cloud-alibaba.adoc
+++ b/spring-cloud-alibaba-docs/src/main/asciidoc-zh/spring-cloud-alibaba.adoc
@@ -29,3 +29,4 @@ include::acm.adoc[]
include::oss.adoc[]
+include::schedulerx.adoc[]
\ No newline at end of file
diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/schedulerx.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/schedulerx.adoc
new file mode 100644
index 00000000..e69de29b
diff --git a/spring-cloud-alibaba-docs/src/main/asciidoc/spring-cloud-alibaba.adoc b/spring-cloud-alibaba-docs/src/main/asciidoc/spring-cloud-alibaba.adoc
index a8c52ae2..294e493b 100644
--- a/spring-cloud-alibaba-docs/src/main/asciidoc/spring-cloud-alibaba.adoc
+++ b/spring-cloud-alibaba-docs/src/main/asciidoc/spring-cloud-alibaba.adoc
@@ -29,3 +29,4 @@ include::acm.adoc[]
include::oss.adoc[]
+include::schedulerx.adoc[]
\ No newline at end of file
diff --git a/spring-cloud-alibaba-examples/pom.xml b/spring-cloud-alibaba-examples/pom.xml
index 98b392f8..9c207c18 100644
--- a/spring-cloud-alibaba-examples/pom.xml
+++ b/spring-cloud-alibaba-examples/pom.xml
@@ -28,6 +28,7 @@
ans-example/ans-provider-example
acm-example/acm-local-example
rocketmq-example
+ schedulerx-example/schedulerx-simple-task-example
diff --git a/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/pom.xml b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/pom.xml
new file mode 100644
index 00000000..5850143a
--- /dev/null
+++ b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/pom.xml
@@ -0,0 +1,37 @@
+
+
+
+ spring-cloud-alibaba-examples
+ org.springframework.cloud
+ 0.1.1.BUILD-SNAPSHOT
+ ../../pom.xml
+
+ 4.0.0
+ schedulerx-simple-task-example
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-alicloud-schedulerx
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/readme-zh.md b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/readme-zh.md
new file mode 100644
index 00000000..9e9b6f02
--- /dev/null
+++ b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/readme-zh.md
@@ -0,0 +1,47 @@
+# SchedulerX Simple Task Example
+
+## 项目说明
+
+本项目展示了,在Spring Cloud体系中,如何快如接入SchedulerX,使用任务调度服务。
+
+SchedulerX 是阿里中间件团队开发的一款分布式任务调度产品。它为您提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
+
+## 示例
+
+### 准备工作
+
+1. 请先[注册阿里云账号](https://account.aliyun.com/register/register.htm?spm=5176.8142029.388261.26.e9396d3eEIv28g&oauth_callback=https%3A%2F%2Fwww.aliyun.com%2F)
+
+2. SchedulerX集成到了EDAS组件中心,因此需要[开通EDAS服务](https://common-buy.aliyun.com/?spm=5176.11451019.0.0.6f5965c0Uq5tue&commodityCode=edaspostpay#/buy)
+
+3. 到[EDAS组件中心](https://edas.console.aliyun.com/#/edasTools)开通SchedulerX组件,即分布式任务管理。
+
+4. 进入[SchedulerX分组管理](https://edas.console.aliyun.com/#/schedulerXGroup?regionNo=cn-test)页面,选择上方"测试"区域,点击右上角"新建分组",创建一个分组。
+
+5. 将"分组ID"的值填写到`application.properties`文件中`key`为`spring.cloud.alicloud.scx.group-id`对应的value值,即如下所示。
+
+ spring.cloud.alicloud.scx.group-id=111-1-1-1111
+
+6. 进入[SchedulerX任务列表](https://edas.console.aliyun.com/#/edasSchedulerXJob?regionNo=cn-test)页面,选择上方"测试"区域,点击右上角"新建Job",创建一个Job,即如下所示。
+
+ Job分组:测试——111-1-1-1111
+ Job处理接口:org.springframework.cloud.alibaba.cloud.examples.SimpleTask
+ 类型:简单Job单机版
+ 定时表达式:默认选项——0 * * * * ?
+ Job描述:无
+ 自定义参数:无
+
+### 启动应用
+
+直接运行main class,即`ScxApplication`。
+
+### 查看效果
+
+观察应用的控制台日志输出,可以看到每一分钟会打印一次如下日志。
+
+```
+ -----------Hello world---------------
+```
+
+如果您对 Spring Cloud SchedulerX Starter 有任何建议或想法,欢迎提交 issue 中或者通过其他社区渠道向我们反馈。
+
diff --git a/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/ScxApplication.java b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/ScxApplication.java
new file mode 100644
index 00000000..baccfd4f
--- /dev/null
+++ b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/ScxApplication.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2018 the original author or authors.
+ *
+ * Licensed 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.springframework.cloud.alibaba.cloud.examples;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ * @author xiaolongzuo
+ */
+@SpringBootApplication
+public class ScxApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ScxApplication.class, args);
+ }
+
+}
diff --git a/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/SimpleTask.java b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/SimpleTask.java
new file mode 100644
index 00000000..e49c0a05
--- /dev/null
+++ b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/java/org/springframework/cloud/alibaba/cloud/examples/SimpleTask.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2018 the original author or authors.
+ *
+ * Licensed 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.springframework.cloud.alibaba.cloud.examples;
+
+import com.alibaba.edas.schedulerx.ProcessResult;
+import com.alibaba.edas.schedulerx.ScxSimpleJobContext;
+import com.alibaba.edas.schedulerx.ScxSimpleJobProcessor;
+
+/**
+ * @author xiaolongzuo
+ */
+public class SimpleTask implements ScxSimpleJobProcessor {
+
+ @Override
+ public ProcessResult process(ScxSimpleJobContext context) {
+ System.out.println("-----------Hello world---------------");
+ ProcessResult processResult = new ProcessResult(true);
+ return processResult;
+ }
+
+}
diff --git a/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/resources/application.properties b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/resources/application.properties
new file mode 100644
index 00000000..a995fa3f
--- /dev/null
+++ b/spring-cloud-alibaba-examples/schedulerx-example/schedulerx-simple-task-example/src/main/resources/application.properties
@@ -0,0 +1,3 @@
+server.port=18033
+spring.cloud.alicloud.scx.group-id=***
+spring.cloud.alicloud.edas.namespace=cn-test
diff --git a/spring-cloud-alicloud-context/pom.xml b/spring-cloud-alicloud-context/pom.xml
index 891f3650..68aa20a9 100644
--- a/spring-cloud-alicloud-context/pom.xml
+++ b/spring-cloud-alicloud-context/pom.xml
@@ -50,6 +50,12 @@
provided
+
+ com.alibaba.edas
+ schedulerX-client
+ provided
+
+
com.alibaba.edas.acm
acm-sdk
diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/nacos/NacosParameterInitListener.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/nacos/NacosParameterInitListener.java
index 6b5a68bd..e3e5eae5 100644
--- a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/nacos/NacosParameterInitListener.java
+++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/nacos/NacosParameterInitListener.java
@@ -1,12 +1,13 @@
package org.springframework.cloud.alicloud.context.nacos;
-import com.alibaba.cloud.context.edas.EdasChangeOrderConfiguration;
-import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.context.ApplicationListener;
+import com.alibaba.cloud.context.edas.EdasChangeOrderConfiguration;
+import com.alibaba.cloud.context.edas.EdasChangeOrderConfigurationFactory;
+
/**
* A listener that prepare initialize the nacos configuration for aliyun acm
*
@@ -24,7 +25,7 @@ public class NacosParameterInitListener
private void preparedNacosConfiguration() {
EdasChangeOrderConfiguration edasChangeOrderConfiguration = EdasChangeOrderConfigurationFactory
- .buildEdasChangeOrderConfiguration();
+ .getEdasChangeOrderConfiguration();
log.info("Initialize Nacos Parameter from edas change order,is edas managed {}.",
edasChangeOrderConfiguration.isEdasManaged());
if (!edasChangeOrderConfiguration.isEdasManaged()) {
diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/scx/ScxContextAutoConfiguration.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/scx/ScxContextAutoConfiguration.java
new file mode 100644
index 00000000..075538e5
--- /dev/null
+++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/scx/ScxContextAutoConfiguration.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2018 the original author or authors.
+ *
+ * Licensed 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.springframework.cloud.alicloud.context.scx;
+
+import javax.annotation.PostConstruct;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.alicloud.context.AliCloudProperties;
+import org.springframework.cloud.alicloud.context.edas.EdasContextAutoConfiguration;
+import org.springframework.cloud.alicloud.context.edas.EdasProperties;
+import org.springframework.context.annotation.Configuration;
+
+import com.alibaba.cloud.context.edas.AliCloudEdasSdk;
+import com.alibaba.cloud.context.scx.AliCloudScxInitializer;
+import com.alibaba.dts.common.exception.InitException;
+
+/**
+ * @author xiaolongzuo
+ */
+@Configuration
+@ConditionalOnClass(name = "org.springframework.cloud.alicloud.scx.ScxAutoConfiguration")
+@EnableConfigurationProperties(ScxProperties.class)
+@ImportAutoConfiguration(EdasContextAutoConfiguration.class)
+public class ScxContextAutoConfiguration {
+
+ private static final Logger log = LoggerFactory
+ .getLogger(ScxContextAutoConfiguration.class);
+
+ @Autowired
+ private AliCloudProperties aliCloudProperties;
+
+ @Autowired
+ private EdasProperties edasProperties;
+
+ @Autowired
+ private ScxProperties scxProperties;
+
+ @Autowired
+ private AliCloudEdasSdk aliCloudEdasSdk;
+
+ @PostConstruct
+ public void initAcmProperties() {
+ try {
+ AliCloudScxInitializer.initialize(aliCloudProperties, edasProperties,
+ scxProperties, aliCloudEdasSdk);
+ }
+ catch (InitException e) {
+ log.error("Init SchedulerX failed.", e);
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/scx/ScxProperties.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/scx/ScxProperties.java
new file mode 100644
index 00000000..db6a00d6
--- /dev/null
+++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/scx/ScxProperties.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2018 the original author or authors.
+ *
+ * Licensed 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.springframework.cloud.alicloud.context.scx;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import com.alibaba.cloud.context.scx.ScxConfiguration;
+
+/**
+ * @author xiaolongzuo
+ */
+@ConfigurationProperties("spring.cloud.alicloud.scx")
+public class ScxProperties implements ScxConfiguration {
+
+ private String groupId;
+
+ private String domainName;
+
+ @Override
+ public String getGroupId() {
+ return groupId;
+ }
+
+ public void setGroupId(String groupId) {
+ this.groupId = groupId;
+ }
+
+ @Override
+ public String getDomainName() {
+ return domainName;
+ }
+
+ public void setDomainName(String domainName) {
+ this.domainName = domainName;
+ }
+
+}
diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/statistics/StatisticsTaskStarter.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/statistics/StatisticsTaskStarter.java
new file mode 100644
index 00000000..41c3591b
--- /dev/null
+++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/statistics/StatisticsTaskStarter.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2018 the original author or authors.
+ *
+ * Licensed 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.springframework.cloud.alicloud.context.statistics;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.cloud.alicloud.context.acm.AcmContextBootstrapConfiguration;
+import org.springframework.cloud.alicloud.context.acm.AcmProperties;
+import org.springframework.cloud.alicloud.context.ans.AnsContextAutoConfiguration;
+import org.springframework.cloud.alicloud.context.ans.AnsProperties;
+import org.springframework.cloud.alicloud.context.edas.EdasProperties;
+import org.springframework.cloud.alicloud.context.oss.OssContextAutoConfiguration;
+import org.springframework.cloud.alicloud.context.oss.OssProperties;
+import org.springframework.cloud.alicloud.context.scx.ScxContextAutoConfiguration;
+import org.springframework.cloud.alicloud.context.scx.ScxProperties;
+import org.springframework.context.annotation.Configuration;
+
+import com.alibaba.cloud.context.AliCloudServerMode;
+import com.alibaba.cloud.context.edas.AliCloudEdasSdk;
+import com.alibaba.cloud.context.statistics.StatisticsTask;
+
+/**
+ * @author xiaolongzuo
+ */
+@Configuration
+@AutoConfigureAfter({ ScxContextAutoConfiguration.class,
+ OssContextAutoConfiguration.class, AnsContextAutoConfiguration.class,
+ AcmContextBootstrapConfiguration.class })
+public class StatisticsTaskStarter implements InitializingBean {
+
+ @Autowired(required = false)
+ private AliCloudEdasSdk aliCloudEdasSdk;
+
+ @Autowired(required = false)
+ private EdasProperties edasProperties;
+
+ @Autowired(required = false)
+ private ScxProperties scxProperties;
+
+ @Autowired(required = false)
+ private OssProperties ossProperties;
+
+ @Autowired(required = false)
+ private AnsProperties ansProperties;
+
+ @Autowired(required = false)
+ private AcmProperties acmProperties;
+
+ @Autowired(required = false)
+ private ScxContextAutoConfiguration scxContextAutoConfiguration;
+
+ @Autowired(required = false)
+ private OssContextAutoConfiguration ossContextAutoConfiguration;
+
+ @Autowired(required = false)
+ private AnsContextAutoConfiguration ansContextAutoConfiguration;
+
+ @Autowired(required = false)
+ private AcmContextBootstrapConfiguration acmContextBootstrapConfiguration;
+
+ @Override
+ public void afterPropertiesSet() {
+ StatisticsTask statisticsTask = new StatisticsTask(aliCloudEdasSdk,
+ edasProperties, getComponents());
+ statisticsTask.start();
+ }
+
+ private List getComponents() {
+ List components = new ArrayList<>();
+ if (scxContextAutoConfiguration != null && scxProperties != null) {
+ components.add("SC-SCX");
+ }
+ if (ossContextAutoConfiguration != null && ossProperties != null) {
+ components.add("SC-OSS");
+ }
+ boolean edasEnabled = edasProperties != null && edasProperties.isEnabled();
+ boolean ansEnableEdas = edasEnabled || (ansProperties != null
+ && ansProperties.getServerMode() == AliCloudServerMode.EDAS);
+ if (ansContextAutoConfiguration != null && ansEnableEdas) {
+ components.add("SC-ANS");
+ }
+ boolean acmEnableEdas = edasEnabled || (acmProperties != null
+ && acmProperties.getServerMode() == AliCloudServerMode.EDAS);
+ if (acmContextBootstrapConfiguration != null && acmEnableEdas) {
+ components.add("SC-ACM");
+ }
+ return components;
+ }
+
+}
diff --git a/spring-cloud-alicloud-context/src/main/resources/META-INF/spring.factories b/spring-cloud-alicloud-context/src/main/resources/META-INF/spring.factories
index b5ed9c32..fb9957b3 100644
--- a/spring-cloud-alicloud-context/src/main/resources/META-INF/spring.factories
+++ b/spring-cloud-alicloud-context/src/main/resources/META-INF/spring.factories
@@ -4,7 +4,9 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.alicloud.context.AliCloudContextAutoConfiguration,\
org.springframework.cloud.alicloud.context.edas.EdasContextAutoConfiguration,\
org.springframework.cloud.alicloud.context.ans.AnsContextAutoConfiguration,\
- org.springframework.cloud.alicloud.context.oss.OssContextAutoConfiguration
+ org.springframework.cloud.alicloud.context.oss.OssContextAutoConfiguration,\
+ org.springframework.cloud.alicloud.context.scx.ScxContextAutoConfiguration,\
+ org.springframework.cloud.alicloud.context.statistics.StatisticsTaskStarter
org.springframework.context.ApplicationListener=\
org.springframework.cloud.alicloud.context.ans.AnsContextApplicationListener,\
org.springframework.cloud.alicloud.context.nacos.NacosParameterInitListener
\ No newline at end of file
diff --git a/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/AliCloudSpringApplicationTests.java b/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/AliCloudSpringApplicationTests.java
index 636adf64..471ffbb9 100644
--- a/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/AliCloudSpringApplicationTests.java
+++ b/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/AliCloudSpringApplicationTests.java
@@ -33,7 +33,9 @@ import org.springframework.test.context.junit4.SpringRunner;
"spring.application.name=myapp",
"spring.cloud.alicloud.edas.application.name=myapp",
"spring.cloud.alicloud.access-key=ak", "spring.cloud.alicloud.secret-key=sk",
- "spring.cloud.alicloud.oss.endpoint=test" }, webEnvironment = RANDOM_PORT)
+ "spring.cloud.alicloud.oss.endpoint=test",
+ "spring.cloud.alicloud.scx.group-id=1-2-3-4",
+ "spring.cloud.alicloud.edas.namespace=cn-test" }, webEnvironment = RANDOM_PORT)
@DirtiesContext
public class AliCloudSpringApplicationTests {
diff --git a/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/scx/ScxPropertiesLoadTests.java b/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/scx/ScxPropertiesLoadTests.java
new file mode 100644
index 00000000..78e6f394
--- /dev/null
+++ b/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/context/scx/ScxPropertiesLoadTests.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2018 the original author or authors.
+ *
+ * Licensed 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.springframework.cloud.alicloud.context.scx;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.alicloud.context.edas.EdasProperties;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author xiaolongzuo
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = ScxContextAutoConfiguration.class, properties = {
+ "spring.cloud.alicloud.scx.group-id=1-2-3-4",
+ "spring.cloud.alicloud.edas.namespace=cn-test" })
+public class ScxPropertiesLoadTests {
+
+ @Autowired
+ private EdasProperties edasProperties;
+
+ @Autowired
+ private ScxProperties scxProperties;
+
+ @Test
+ public void testSxcProperties() {
+ assertThat(scxProperties.getGroupId()).isEqualTo("1-2-3-4");
+ assertThat(edasProperties.getNamespace()).isEqualTo("cn-test");
+ assertThat(scxProperties.getDomainName()).isNull();
+ }
+
+}
diff --git a/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/scx/ScxAutoConfiguration.java b/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/scx/ScxAutoConfiguration.java
new file mode 100644
index 00000000..a1128b92
--- /dev/null
+++ b/spring-cloud-alicloud-context/src/test/java/org/springframework/cloud/alicloud/scx/ScxAutoConfiguration.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2018 the original author or authors.
+ *
+ * Licensed 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.springframework.cloud.alicloud.scx;
+
+/**
+ * @author xiaolongzuo
+ */
+public class ScxAutoConfiguration {
+}
diff --git a/spring-cloud-alicloud-schedulerx/pom.xml b/spring-cloud-alicloud-schedulerx/pom.xml
new file mode 100644
index 00000000..a2a5e117
--- /dev/null
+++ b/spring-cloud-alicloud-schedulerx/pom.xml
@@ -0,0 +1,48 @@
+
+
+
+ spring-cloud-alibaba
+ org.springframework.cloud
+ 0.1.1.BUILD-SNAPSHOT
+
+ 4.0.0
+ spring-cloud-alicloud-schedulerx
+ Spring Cloud Alibaba Cloud SchedulerX
+
+
+
+ org.springframework.cloud
+ spring-cloud-alicloud-context
+
+
+ org.slf4j
+ slf4j-api
+
+
+ com.alibaba.edas
+ schedulerX-client
+
+
+ com.aliyun
+ aliyun-java-sdk-core
+
+
+ com.aliyun
+ aliyun-java-sdk-edas
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+ provided
+ true
+
+
+ org.springframework.boot
+ spring-boot-actuator
+ true
+
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-alicloud-schedulerx/src/main/java/org/springframework/cloud/alicloud/scx/ScxAutoConfiguration.java b/spring-cloud-alicloud-schedulerx/src/main/java/org/springframework/cloud/alicloud/scx/ScxAutoConfiguration.java
new file mode 100644
index 00000000..77669f50
--- /dev/null
+++ b/spring-cloud-alicloud-schedulerx/src/main/java/org/springframework/cloud/alicloud/scx/ScxAutoConfiguration.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2018 the original author or authors.
+ *
+ * Licensed 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.springframework.cloud.alicloud.scx;
+
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * placeholder configuration
+ *
+ * @author xiaolongzuo
+ */
+@Configuration
+public class ScxAutoConfiguration {
+
+}
diff --git a/spring-cloud-alicloud-schedulerx/src/main/java/org/springframework/cloud/alicloud/scx/endpoint/ScxEndpoint.java b/spring-cloud-alicloud-schedulerx/src/main/java/org/springframework/cloud/alicloud/scx/endpoint/ScxEndpoint.java
new file mode 100644
index 00000000..96c31901
--- /dev/null
+++ b/spring-cloud-alicloud-schedulerx/src/main/java/org/springframework/cloud/alicloud/scx/endpoint/ScxEndpoint.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2018 the original author or authors.
+ *
+ * Licensed 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.springframework.cloud.alicloud.scx.endpoint;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.actuate.endpoint.AbstractEndpoint;
+import org.springframework.cloud.alicloud.context.edas.EdasProperties;
+import org.springframework.cloud.alicloud.context.scx.ScxProperties;
+
+/**
+ * @author xiaolongzuo
+ */
+public class ScxEndpoint extends AbstractEndpoint