在EDAS控制台中,已经无缝集成了阿里巴巴的分布式任务调度系统SchedulerX作为核心组件,以实现高效的任务调度管理功能。本文将介绍如何在您的Spring Cloud应用中使用SchedulerX实现任务调度,并部署到EDAS中,实现一个简单Job单机版的任务调度功能。
为什么使用SchedulerX
SchedulerX是阿里巴巴的一款分布式任务调度产品。它为您提供秒级、精准、高可靠、高可用的定时(基于Cron表达式)任务调度服务,同时提供分布式的任务执行模型,如MapReduce模型。
在本地实现任务调度
创建命名为
scx-example
的Maven工程。以Spring Boot 2.1.4.RELEASE和Spring Cloud Finchley.SR1为例,在pom.xml文件中添加如下依赖。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx2-spring-boot-starter</artifactId> <version>${schedulerx2.version}</version> <!--如果用的是logback,需要把log4j和log4j2排除掉 --> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> </exclusion> <exclusion> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.SR1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
说明如果您需要选择使用Spring Boot 1.x的版本,请使用Spring Boot 1.5.x和Spring Cloud Edgware版本,对应的Spring Cloud Alibaba版本为1.5.1.RELEASE。
Spring Boot 1.x版本的生命周期已结束,推荐使用Spring Boot新版本开发您的应用。
创建
scx-example
的启动类ScxApplication
。import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ScxApplication { public static void main(String[] args) { SpringApplication.run(ScxApplication.class, args); } }
创建一个简单的类
TestService
,通过Spring向测试任务中的IoC进行注入。import org.springframework.stereotype.Service; @Service public class TestService { public void test() { System.out.println("---------IOC Success--------"); } }
创建一个简单的
SimpleTask
作为测试任务类,并在其中注入TestService
。import com.alibaba.edas.schedulerx.ProcessResult; import com.alibaba.schedulerx.worker.domain.JobContext; import com.alibaba.schedulerx.worker.processor.JavaProcessor; import org.springframework.beans.factory.annotation.Autowired; public class SimpleTask implements ScxSimpleJobProcessor { @Autowired private TestService testService; @Override public ProcessResult process(JobContext context) { System.out.println("-----------Hello world---------------"); testService.test(); return new ProcessResult(true); } }
创建调度任务并添加配置。
在创建的任务分组中按以下参数创建任务。具体操作,请参见创建调度任务。
应用ID:选择在测试地域下刚创建的任务分组。
Processor类名:Job处理接口实现类的全类名,本文档中为SimpleTask,和应用中的测试任务类保持一致。
执行模式:单机运行。
cron表达式:默认选项,
*0 * * * * ?*
表示任务每分钟会被执行一次。描述:无
任务参数:无
在本地Maven工程的src/main/resources路径下创建文件application.properties,在其中添加如下配置。
server.port=18033 # 配置任务的地域(测试地域对应的**regionName**为*cn-test*)和分组ID(group-id) spring.schedulerx2.endpoint=acm.aliyun.com spring.schedulerx2.namespace=d1ce9d38-ab9b-444e-ab2a-4***** spring.schedulerx2.groupId=**** spring.schedulerx2.appKey=5pHlwaWpluJGd39******
执行
ScxApplication
中的main函数,启动服务。
结果验证
在IDEA的Console中观察标准输出,可以看到会定时地打印出如下的测试信息。
-----------Hello world---------------
---------IOC Success--------
部署到EDAS
SchedulerX在设计之初就考虑到了从开发环境迁移到EDAS的场景,您可以直接将应用部署到EDAS中,无需修改任何代码和配置。关于部署方式和详细步骤的相关内容,请参见创建和部署应用概述(K8s)和应用创建和部署概述(ECS)。
在部署完成之后,即可使用EDAS控制台进行任务调度。
在非测试地域使用调度任务的附加步骤
本文档以在测试地域中使用为例,测试环境为公网环境,您在本地或云端都可以进行验证,且没有权限的限制。如果您要部署到其它地域(如杭州)中,还需要在创建调度任务并调度的步骤中完成以下操作:
登录安全信息管理页面,获取AccessKey ID和AccessKey Secret。
在
application.properties
文件中配置调度任务。除了简单Job单机版,您还可以配置其它类型的调度任务。相关内容,请参见什么是分布式任务调度SchedulerX。
在
application.properties
文件中添加您阿里云账号的AccessKey ID和AccessKey Secret的配置。spring.cloud.alicloud.access-key=xxxxx spring.cloud.alicloud.secret-key=xxxxx
后续操作
您的应用部署到EDAS之后,就可以使用SchedulerX组件实现更多任务调度的能力。相关内容,请参见什么是分布式任务调度SchedulerX。