spring中定时任务的多种实现
2021-04-22 21:34
标签:wired 防止 定时 image 配置文件 xmlns 标签设置 ima 引用 本文主要是记录工作中所遇到的情况,并非教学!!! 1.更改ApplicationContext-mvc.xml/spring.xml 等配置文件,如果不知道自己应该配置哪个文件的话去web.xml中找到
文件中需要更改的内容如下:
(3)添加 task标签设置 ,可以详细配置也可以直接默认 (4)不要忘记配置你要执行的自动化程序所在的包的路径,将该包的路径加入扫描(按照自身实际情况配置) 2.创建你的定时任务程序 1.通过官网下载quartz ,下载完成是下图的压缩包 解压后相应目录下有你需要的jar包,自行导入即可(其他的都是依赖jar包,最低情况只需要导入quartz自身的两个jar就行)
配置一下日志打印(依赖于log4j组件) 2.此处就不讲quartz怎么使用了,结合网上的分享,这里提供一个工具类方便直接调用 3.方式一 :创建自己的job类,然后通过@PostConstruct注解在项目启动后调用(配合第二条使用) 下面是调用方法 4.方式二 :直接通过spring的xml配置完成(在web.xml的 spring中定时任务的多种实现 标签:wired 防止 定时 image 配置文件 xmlns 标签设置 ima 引用 原文地址:https://www.cnblogs.com/qingfengsuixin/p/13272813.html一、通过spring自带的@Scheduled注解实现定时任务
(1)xmlns:task="http://www.springframework.org/schema/task"
(2)xsi:schemaLocation中添加 (其中spring-task-3.1.xsd的版本可以更改看你的spring版本)具体参考下图
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd 1 beans xmlns="http://www.springframework.org/schema/beans"
2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xmlns:context="http://www.springframework.org/schema/context"
4 xmlns:aop="http://www.springframework.org/schema/aop"
5 xmlns:mvc="http://www.springframework.org/schema/mvc"
6 xmlns:task="http://www.springframework.org/schema/task"
7 xsi:schemaLocation="http://www.springframework.org/schema/beans
8 http://www.springframework.org/schema/beans/spring-beans.xsd
9 http://www.springframework.org/schema/aop
10 http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
11 http://www.springframework.org/schema/context
12 http://www.springframework.org/schema/context/spring-context.xsd
13 http://www.springframework.org/schema/mvc
14 http://www.springframework.org/schema/mvc/spring-mvc.xsd
15 http://www.springframework.org/schema/task
16 http://www.springframework.org/schema/task/spring-task-3.1.xsd">
1
2 task:executor id="executor" pool-size="5" />
3 task:scheduler id="scheduler" pool-size="10" />
4 task:annotation-driven executor="executor" scheduler="scheduler" />
5
6
7
8 task:annotation-driven />
context:component-scan base-package="com.project.*" />
1 /**
2 * @author
3 * @Time 2020-07-08 17:07
4 */
5 //必须添加注解交由spring管控才能生效
6 @Component
7 public class ScheduledDemo {
8 //由于将整个类交由spring管控不必担心@Autowired注解失效的情况
9 @Autowired
10 private TestService testService;
11
12 //有点缺点该注解只支持6位参数的cron表达式不支持7位的
13 @Scheduled(cron = "0 0/1 * * * ? ")
14 public void aaa(){
15 //实现你需要的方法即可
16 testService.XXX();
17 System.out.println("哈哈哈哈");
18 }
19
20 }
二、通过quartz组件实现定时任务(有点问题按照网上的方法最后我也没成功纳入spring管理。。。)
1 /**
2 * @author
3 * @Time 2020-07-06 17:00
4 */
5 public class SchedulerUtil {
6 private static Logger logger = Logger.getLogger(SchedulerUtil.class);// log4j记录日志
7 /**
8 * [简单任务调度:每次执行间隔为多少毫秒,执行多少次]
9 * @param jobName 任务名字
10 * @param jobGroupName 任务组名字
11 * @param triggerName 触发器名字
12 * @param triggerGroupName 触发器组名字
13 * @param jobClass 任务类
14 * @param time 时间间隔
15 * @param count 执行几次
16 */
17 public static void handleSimpleTrigger(String jobName, String jobGroupName,
18 String triggerName, String triggerGroupName, Class jobClass,
19 int time, int count) {28 // 通过schedulerFactory获取一个调度器
29 SchedulerFactory schedulerfactory = new StdSchedulerFactory();
30 Scheduler scheduler = null;
31 try {
32 // 通过schedulerFactory获取一个调度器
33 scheduler = schedulerfactory.getScheduler();
34 // 创建jobDetail实例,绑定Job实现类
35 // 指明job的名称,所在组的名称,以及绑定job类
36 JobDetail job = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
37 // 定义调度触发规则
38 //使用simpleTrigger规则
39 Trigger trigger=TriggerBuilder.newTrigger().withIdentity(triggerName,triggerGroupName)
40 .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(time).withRepeatCount(count))
41 .build();
42 // 把作业和触发器注册到任务调度中
43 scheduler.scheduleJob(job, trigger);
44 // 启动调度
45 scheduler.start();
46 } catch (Exception e) {48 logger.error("执行"+jobName+"组"+jobName+"任务出现异常E:["+ e.getMessage() + "]");
49 }
50 }
51 /**
52 * [复杂任务调度:每天几点几分几秒定时执行任务]
53 * @param jobName 任务名字
54 * @param jobGroupName 任务组名字
55 * @param triggerName 触发器名字
56 * @param triggerGroupName 触发器组名字
57 * @param jobClass 任务类
58 * @param cron 触发规则
59 */
60 /**
61 *
62 *
63 */
64 public static void hadleCronTrigger(String jobName, String jobGroupName,
65 String triggerName, String triggerGroupName, Class jobClass,String cron) {73 // 通过schedulerFactory获取一个调度器
74 SchedulerFactory schedulerfactory = new StdSchedulerFactory();
75 Scheduler scheduler = null;
76 try {
77 // 通过schedulerFactory获取一个调度器
78 scheduler = schedulerfactory.getScheduler();
79 // 创建jobDetail实例,绑定Job实现类
80 // 指明job的名称,所在组的名称,以及绑定job类
81 JobDetail job = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
82 // 定义调度触发规则
83 //使用cornTrigger规则 每天18点30分
84 Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName)
85 .withSchedule(CronScheduleBuilder.cronSchedule(cron))
86 .build();
87 // 把作业和触发器注册到任务调度中
88 scheduler.scheduleJob(job, trigger);
89 // 启动调度
90 scheduler.start();
91 } catch (Exception e) {93 logger.error("执行" + jobName + "组" + jobName + "任务出现异常E:[" + e.getMessage() + "]");
94 }
95 }
96 }/**
* @author
* @Time 2020-07-06 17:40
*/
@DisallowConcurrentExecution //不允许job并发执行,防止重复调用,只对于同一实例有效,不同jobDetails引用同一个job时不起作用
public class TPersonFollowUpJob implements Job {
@Autowired
private TestService testService;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//因为没有被纳入spring管理,所以这里通过这个方法实现调用spring管理的组件让该页面的@Autowired 注解生效 SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
//自己要实现的方法
testService.XXX();
System.out.println("哈哈哈哈");
}
}
//该注解保证了该方法可以在程序启动后自动调用执行一次
@PostConstruct
public void start(){
//这里使用我们前面定义好的工具类来调用我们的Job方法类,这里的cron表达式支持最多7位参数
SchedulerUtil.hadleCronTrigger("任务名字", "任务组名字","触发器名字", "触发器组名字", TPersonFollowUpJob.class,"0 0/1 * * * ? *");
}
1
2
3
4 bean id="TPersonFollowUpTasksService" class="com.msunsoft.service.personMana.Impl.TPersonFollowUpTasksServiceImpl">bean>
5 bean id="JobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
6 property name="targetObject">
7 ref bean="TPersonFollowUpTasksService" />
8 property>
9 property name="targetMethod">
10
11 value>createFollowUpTasksvalue>
12 property>
13 property name="concurrent">
14 value>falsevalue>
15 property>
16 bean>
17
18 bean id="deleteDataTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
19 property name="jobDetail">
20 ref bean="JobDetail" />
21 property>
22 property name="cronExpression">
23
24 value>0 0/1 * * * ? *value>
25 property>
26 bean>
27
28 bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" autowire="no">
29 property name="triggers">
30 list>
31 ref bean="deleteDataTrigger" />
32 list>
33 property>
34 property name="autoStartup">
35 value>truevalue>
36 property>
37 bean>
38
上一篇:python对函数的理解