spring 定时任务

可基于注解,也可基于配置

1.在配置文件中配置定时任务

spring配置文件中,添加命名空间
1
2
3
4
在<beans >中添加
xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.2.xsd
xml添加配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<!-- 定时任务 (将类注入xml)-->
<bean id="jobBean" class="com.bxj.common.task.ClearOrderTask" />
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobBean" />
<!--ClearOrderTask类中需要执行的方法-->
<property name="targetMethod" value="doClearOrder" />
<!--将并发设置为false-->
<property name="concurrent" value="false" />
</bean>

<bean id="clearOrderTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail" />
<!--表达式,每天晚上23点55分开始 执行一次 (可以自定义,谷歌关键词 cron表达式) -->
<property name="cronExpression" value="0 55 23 * * ?" />
</bean>

<!--总管理类如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="orderQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" >
<property name="triggers">
<list>
<!--作业调度器,list下可加入其他的调度器 -->
<ref bean="clearOrderTrigger" />
</list>
</property>
</bean>
执行方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
	public class ClearOrderTask {	
/**
* 调度任务开关
*/
@Value("${CLEAR_ORDER_TASK_SWITCH}")
private String CLEAR_ORDER_TASK_SWITCH;
@Autowired
private OrderInfoService orderInfoService;
@Autowired
private OrderDetailService orderDetailService;
@Transactional
public void doClearOrder() throws Exception{
//检查配置文件任务开关
if( Const.TASK_SWITCH_ON.equals( CLEAR_ORDER_TASK_SWITCH )){
//清除订单
//先删除订单明细
orderDetailService.deleteOrderDetailByTask();
//再删除订单
orderInfoService.deleteOrderInfoByTask();;
}
}
}

2.注解配置定时任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Component
public class MyTask2 {
/**
* 定时计算。每天凌晨 01:00 执行一次
*/
@Scheduled(cron = "0 0 1 * * *")
public void show() {
System.out.println("show method 2");
}

/**
* 启动时执行一次,之后每隔2秒执行一次
*/
@Scheduled(fixedRate = 1000*2)
public void print() {
System.out.println("print method 2");
}
}

定时任务和cron表达式相关链接

参考链接
在线cron表达式生成器
cron表达式详解