1、在入口类中加入@EnableScheduling注解:
@SpringBootApplication
@EnableScheduling
public class CuwiTaskApplication extends SpringBootServletInitializer {
protected static final Logger logger = LoggerFactory.getLogger(CuwiTaskApplication.class);
public static void main(String[] args) throws Exception {
SpringApplication.run(CuwiTaskApplication.class, args);
logger.info("水业大学Task");
}
}
2、创建定时器类,类中的方法注解了@Scheduled就是一个定时器:
方式一:
@Component
public class ScheduledTasks {
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
/**
* 每分钟处理一次
*/
@Scheduled(fixedRate = 1000 * 60 * 30)
public void handleAchievement() {
log.info("定时任务 处理开始");
// 请求页码
int pageNo = 1;
// 处理并返回总页数
int totalPage = handleAchievementList(pageNo);
pageNo++;
while ((totalPage - pageNo) >= 0) {
// 处理
handleAchievementList(pageNo);
pageNo++;
}
log.info("定时任务 处理结束");
}
方式二:
@Component
public class MeetingTasks {
private static final Logger log = LoggerFactory
.getLogger(MeetingTasks.class);
@Autowired
private IMeetingService meetingService;
// 会议开始报名状态
@Scheduled(cron = "0 40 1 * * ?")
public void initMeetingStartSign() {
log.info("会议开始报名 定时任务 处理开始");
Meeting meetingPara = new Meeting();
meetingPara.setIsVirtualDelete(0);
meetingPara.setSignTaskType(1);// 报名定时任务类型:1开始报名,2停止报名
List<Meeting> meetingList = meetingService.queryList(meetingPara);
if (meetingList != null) {
for (Meeting meeting : meetingList) {
if (meeting.getSignStatus() != MeetingConstant.SIGN_STATUS.ACCEPT_APPLICATIONS
.getKey()) {
meeting.setSignStatus(MeetingConstant.SIGN_STATUS.ACCEPT_APPLICATIONS
.getKey());
Integer ret = meetingService.updateById(meeting);
if (ret == 1) {
log.info("当天开始报名的会议状态为:报名中!");
}
}
}
}
log.info("会议开始报名 定时任务 处理结束");
}
从上面的代码可以看出:@Scheduled有三个属性,分别是:cron expression,fixedDelay,fixedRate (cron,fixdDelay,fixedRate三个属性必须设置一个)
cron:指定的分钟,小时,月,月和日触发。
fixedDelay:在上次调用结束和下一次调用的开始之间以毫秒为单位执行注释方法。
fixedRate:在调用之间以毫秒为单位的固定周期执行带注释的方法。
注意
需要注意的几点:
1、spring的@Scheduled注解 需要写在实现上;
2、 定时器的任务方法不能有返回值(如果有返回值,spring初始化的时候会告诉你有个错误、需要设定一个proxytargetclass的某个值为true);
3、实现类上要有组件的注解@Component。