CodeWorld-Cloud-Shop XXL-JOB动态创建任务详解篇1---奶妈级教学

515 阅读5分钟

CodeWorld-Cloud-Shop XXL-JOB动态创建任务详解篇1---奶妈级教学

前言

我们在CodeWorld-Cloud-Shop XXL-JOB入门详解篇介绍了XXL-JOB的基本使用 如果你还没有进行入门的同学,就先来一段奶妈级教学吧,然后再进行下一阶段

问题探索

我们虽然在入门级教学中演示了XXL-JOB任务调度的基本使用,我们也体会到了XXL-JOB的优越性以及页面操作的简单性 这样我们可以在界面直接对任务进行启动,停止等等操作 这让我很是舒服,但是可怕的事情来了

我们有这样一个需求,就拿项目中的来说

在商城首页呢,我们有一个轮播图,那么这个轮播图是随时进行切换的,我们随时可能在一个指定的时间更新这个轮播图信息 那么问题来了,当我们在添加轮播图时会给他指定一个上线和下线的时间,可能会有很多的轮播图添加,那我们每添加一个轮播图就去XXL-JOB的 可视化界面添加一个任务吗?那这样我们的手还不得断?还有加入我要在2021-01-01:12:05:35这个时间上线轮播图,那么我们在去手写CRON表达 式来执行任务吗?那我觉得你是真的有耐性,还附带了一个下线时间,上线和下线的时间都不一样。

那么我们应该怎么解决呢?

问题解决

首先呢,遇事不要慌,消灭恐惧的做好办法就是面对恐惧,奥利给

首先我们来看 add-task 我们在这里可以清楚的看见,这很明显就是一个表单嘛,那么既然是表单,那就好办了 有表单就有接口,那么来到我们xxl-job-admin的接口看看呢 xxl-job-interface 嚯哟,原来一切的接口都在这里啊 还好没放弃,哭了哭了 那么我们一路追踪下去来到 添加任务这个接口的实现类方法 我们可以看见传入的参数就是这个XxlJobInfo

private int id;				// 主键ID
	
	private int jobGroup;		// 执行器主键ID
	private String jobDesc;
	
	private Date addTime;
	private Date updateTime;
	
	private String author;		// 负责人
	private String alarmEmail;	// 报警邮件

	private String scheduleType;			// 调度类型
	private String scheduleConf;			// 调度配置,值含义取决于调度类型
	private String misfireStrategy;			// 调度过期策略

	private String executorRouteStrategy;	// 执行器路由策略
	private String executorHandler;		    // 执行器,任务Handler名称
	private String executorParam;		    // 执行器,任务参数
	private String executorBlockStrategy;	// 阻塞处理策略
	private int executorTimeout;     		// 任务执行超时时间,单位秒
	private int executorFailRetryCount;		// 失败重试次数
	
	private String glueType;		// GLUE类型	#com.xxl.job.core.glue.GlueTypeEnum
	private String glueSource;		// GLUE源代码
	private String glueRemark;		// GLUE备注
	private Date glueUpdatetime;	// GLUE更新时间

	private String childJobId;		// 子任务ID,多个逗号分隔

	private int triggerStatus;		// 调度状态:0-停止,1-运行
	private long triggerLastTime;	// 上次调度时间
	private long triggerNextTime;	// 下次调度时间

这里面有很多的参数信息,都很清楚明了 那么我们想想,再想想 接口有,参数信息我们也知道,那么我们不就可以直接调用他这个接口,传入想要的参数信息不就ok吗? 那么我们就不用再去可视化界面进行操作,那不就可以了吗?

意思好像是这个意思,那么哦们应该怎么去操作呢?

还有XXL-JOB这个是在另外一个项目上,而我们的却在另外一个项目上,那么我们怎么才能去调用这个接口呢?

那么就是用到远程调用了,这里我们使用的是RestTemplate这个来实现调用 你可以考虑使用openFeign来实现[CodeWorld-Cloud-Shop openFeign技术---奶妈级教学]

问题重重

那这样的还有一个问题,首先我们要在界面上操作是吧,那么要进入界面的第一步是什么呢? 登录。。对就是登录 要登录上去了才会使用到我们这些接口,如果没有登录那么就会被拦截掉 xxl-job-permission 我们这里很清楚的看见,这里设置了对接口使用了拦截器 那么这里面有一个很清楚的注解 PermissionLimit

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PermissionLimit {
	
	/**
	 * 登录拦截 (默认拦截)
	 */
	boolean limit() default true;

	/**
	 * 要求管理员权限
	 *
	 * @return
	 */
	boolean adminuser() default false;

}

有一个limit的属性,默认的是true,就是说如果设置limit为true的话就需要被拦截,需要登录才能调用 那么我们想到如果设置为false,是不是就可以不用登录调用了 是的,我们这里呢,就是这样做的 那么我们就需要重新写一个接口,然后在这个接口上加上这个注解并设置为false

那么到这里我们的问题就基本解决了 流程呢就是

1.在xxl-job-admin项目的原有基础上开发新的一个接口,加上 `PermissionLimit`并设置为false
2.使用RestTemplate进行远程调用,实现任务的添加

那么我们将在下一节继续讲解CodeWorld-Cloud-Shop XXL-JOB动态创建任务详解篇2---奶妈级教学 好了,本次的技术解析就到这里了?如果觉得不错的话,点亮一下小星星codeworld-cloud-shop 只看不点,不是好孩子哦!!!

欢迎加入QQ群(964285437)