前言
在写这边文章之前,也du娘过相关文章,大部分都是按照参考文档略作解释就算完了,关键点都没怎么说。。。定时任务在实际的工作当中,不可能全开全停,很多都是后台管理端有个简单的定时任务管理页面,超管可以对定时任务进行部分操作,例如:开启/关闭某个定时任务,一键开启/停止定时任务,说到这儿,前端要展示数据,后端最起码要有个任务列表数据返回吧。。。然。。。看了很多管理Hutool的相关文章,都没有这些,只是简单的介绍了怎么用,怎么开启。。。
简介
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;
Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。
定时任务
1、引入依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.9</version>
</dependency>
2、测试类
public class TestJob01 {
public String execute() {
System.out.println("-------------------TestJob01任务执行开始-------------------");
System.out.println(new Date());
System.out.println("-------------------TestJob01任务执行结束-------------------");
}
}
3、通过配置文件来启动定时和任务
对于Maven项目,首先在src/main/resources/config下放入cron.setting文件(默认是这个路径的这个文件),然后在文件中放入定时规则,规则如下:
[com.wlsk.idc.mission.job]
TestJob01.execute=0/2 * * * * ?
中括号表示分组,也表示需要执行的类或对象方法所在包的名字,这种写法有利于区分不同业务的定时任务。
TestJob01.execute表示需要执行的类名和方法名(通过反射调用,不支持Spring和任何框架的依赖注入),0/2 * * * * ?表示定时任务(cron)表达式
4、启动项目
在启动项目添加一个main()方法
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
//支持秒级别定时任务
CronUtil.setMatchSecond(true);
//通过配置文件启动定时任务
CronUtil.start();
}
}
start()这个方法只会启动配置文件中的定时任务,动态添加的任务它是不会管的,至于动态添加定时任务,请继续往下看
5、动态添加定时任务
当然,如果你想动态的添加定时任务,使用CronUtil.schedule(String schedulingPattern, Runnable task)方法即可(使用此方法加入的定时任务不会被写入到配置文件,前提是你没有在配置文件配置该方法)。
public class TestJob01 {
private static String cronString = "*/2 * * * * *";
private static String scheduleId;
public String execute() {
String jobId = CronUtil.schedule(cronString, new Task() {
@Override
public void execute() {
System.out.println("-------------------TestJob01任务执行开始-------------------");
System.out.println(new Date());
System.out.println("-------------------TestJob01任务执行结束-------------------");
}
});
if (!StringUtil.isEmpty(jobId)) {
scheduleId = jobId;
return jobId;
} else {
return null;
}
}
public void remove() {
CronUtil.remove(scheduleId);
}
}
上面一段的代码中,还有个 == CronUtil.remove(scheduleId) == 这个方法,这个方法是通过CronUtil.schedule()返回的id来进行停止定时任务,准确的说应该是删除任务,== CronUtil.stop() == 这个方法是停止所有任务的,所以一般来说,尽量别用吧,除非对所有定时任务对项目没啥影响,当然,使用stop()作为前端一键停止的按钮还是可以的
6、启动动态添加的定时任务
1)、在启动类中添加,跟随项目启动而启动
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(Application.class, args);
TestJob01 testJob01 = run.getBean(TestJob01.class);
CronUtil.setMatchSecond(true);
CronUtil.start();
testJob01.execute();
}
}
通过反射拿取TestJob01,然后调用execute();
2)、创建一个定时任务的Controller
/**
* @author 飞廉少将
* @program: idc
* @description: hutool工具类_定时任务_停止
* @time 2021/3/10
*/
@RestController
@RequestMapping("/admin/hutool/job/")
@Slf4j
@Api(tags = "hutool定时器管理")
public class HutoolCronController {
@Autowired
private TestJob01 testJob01;
@ApiOperation("停止定时任务")
@GetMapping("hutoolStop")
public void hutoolStop() {
CronUtil.stop();
}
@ApiOperation("启动test01")
@GetMapping("hutoolStart")
public String hutoolStart() {
return testJob01.execute();
}
@ApiOperation("停止test01")
@GetMapping("hutoolRemove")
public void hutoolRemove() {
testJob01.remove();
}
}
这样可能会有些繁琐,但是如果前端需要一个定时任务列表或者其他的操作,这个controller就可以作为一个对外的接口
这两种动态定时任务的启动方式建议混用,也可能根据实际需求进行调用。。。
7、获取定时任务列表
这个在du娘上没有相关的文章,目前我也正在研究中。。。后面如果我测试没问题了,会把相关代码粘贴上来
Hutool总体来说是个比较好用的工具类,当然,大神肯定有自己的工具类,然而,大神毕竟是少数,多数还是普罗大众啊,哈哈。。。所以,大家可以尝试着用用,目前我所在组没说要用,但是当提前了解了,方便后面好用。。
如果文章对你有所帮助,点个赞吧。。。