应用场景
未来固定时间点跑一次,任务自动销毁。常见场景
- 订单超时未支付自动关闭
- 定时日历提醒
优势
精准时刻
SchedulerX的一次性任务与延时消息相比,没有固定延迟多少时间或者在多少天内的限制,可以支持到未来任意时间点,使用简单。
丰富的任务类型
SchedulerX一次性任务可以适用所有任务类型,比如java、http、shell任务。也可以适用所有分布式模型,比如单机、广播、分片、MapReduce等。
可视化运维
SchedulerX的一次性任务,和其他任务一样,有可视化的界面可以看到和查询,甚至可以在调度时间来临之前随意修改任务参数。
支持失败自动重试等功能。
用法
通过API创建one_time任务
api sdk升级到1.0.6以上版本
<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-schedulerx2</artifactId> <version>1.0.6</version> </dependency>
schedulerx-worker版本需要升级到1.3.4以上,以springboot starter为例
<dependency> <groupId>com.aliyun.schedulerx</groupId> <artifactId>schedulerx2-spring-boot-starter</artifactId> <version>1.3.4</version> </dependency>
创建任务,timeType设置为5,代码如下:
import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.schedulerx2.model.v20190430.CreateJobRequest; import com.aliyuncs.schedulerx2.model.v20190430.CreateJobResponse; public class CreateJavaJob { public static void main(String[] args) throws Exception { // Open API 的接入点,具体查看上表支持地域列表以及购买机器地域填写 String regionId = "public"; //鉴权使用的 AccessKeyId,由阿里云官网控制台获取 String accessKeyId = "xxxxxxxx"; //鉴权使用的 AccessKeySecret,由阿里云官网控制台获取 String accessKeySecret = "xxxxxxxxx"; //产品名称 String productName ="schedulerx2"; //对照支持地域列表选择Domain填写 String domain ="schedulerx.aliyuncs.com"; //构建 OpenApi 客户端 DefaultProfile.addEndpoint(regionId, productName, domain); DefaultProfile defaultProfile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret); DefaultAcsClient client = new DefaultAcsClient(defaultProfile); CreateJobRequest request = new CreateJobRequest(); request.setJobType("java"); request.setExecuteMode("standalone"); request.setDescription("test"); request.setName("一次性任务测试"); request.setClassName("com.alibaba.schedulerx.test.processor.HelloWorldJob3"); //timeType=5表示一次性任务 request.setTimeType(5); //yyyy-MM-dd HH:mm:ss request.setTimeExpression("2021-12-15 12:11:00"); request.setNamespace("433d8b23-06e9-408c-aaaa-90d4d1b9a4af"); request.setGroupId("xueren_sub"); // 监控报警 request.setTimeoutEnable(true); request.setTimeoutKillEnable(true); request.setFailEnable(true); request.setTimeout(12300L); // 高级配置,配置失败自动重试 request.setMaxAttempt(3); request.setAttemptInterval(30); CreateJobResponse response = client.getAcsResponse(request); if (response.getSuccess()) { System.out.println("jobId=" + response.getData().getJobId()); } else { System.out.println(response.getMessage()); } } }
控制台可视化
通过API新建任务后,可以在控制台看到一次性任务如下图
任务实现
和其他任务实现一致,任务执行完,调度平台会自动清理任务,客户端不需要删除任务
import com.alibaba.schedulerx.worker.domain.JobContext; import com.alibaba.schedulerx.worker.processor.JavaProcessor; import com.alibaba.schedulerx.worker.processor.ProcessResult; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.stereotype.Component; @Component public class HelloWorldJob3 extends JavaProcessor { @Override public ProcessResult process(JobContext context) throws Exception { System.out.println("hello HelloWorldJob3"); return new ProcessResult(true); } }
查看历史执行记录
因为一次性任务跑完就删了,无法通过任务搜索执行列表,不过可以通过日志服务查看任务历史执行的日志。