一、scheduled定时任务器
Scheduled 定时任务器:是 Spring3.0 以后自带的一个定时任务器。
1.1 scheduled基于配置方式
1.1.1 job类
用来写要定时的业务。
例子:打印时间
public class JobDemo {@Scheduled(cron="*/1 * * * * ?")public void method(){System.out.println(new Date());}
}
1.1.2 applicationContext-task.xml
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd">
1.1.3 测试类
public class ScheduledTest {public static void main(String[] args) throws IOException {new ClassPathXmlApplicationContext("classpath:applicationContext-task.xml");System.in.read();}
}
1.2 scheduled基于注解方式
1.2.1 job类
@Componen
@EnableScheduling //告诉spring这是个定时任务类
public class JobDemo @Scheduled(cron="*/1 * * * * ?")public void method(){System.out.println(new Date());}
}
1.2.2 applicationContext-task.xml
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd">
1.2.3 测试类
public class ScheduledTest {public static void main(String[] args) throws IOException {new ClassPathXmlApplicationContext("classpath:applicationContext-task.xml");System.in.read();}
}
二、 quartz定时任务框架
2.1 Quartz是什么
- Quartz是OpenSymphony开源组织在Jobscheduling领域又一个开源项目。
- 它可以与J2EE与J2SE应用程序相结合也可以单独使用。
- Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。
- Jobs可以做成标准的Java组件或EJBs。
- Quartz的最新版本为Quartz2.2.1。
2.2 Quartz框架的使用思路
- job - 任务 - 你要做什么事?
- Trigger - 触发器 - 你什么时候去做?
- Scheduler - 任务调度 - 你什么时候需要去做什么事?
2.3 Quartz框架的使用
2.3.1 添加依赖
2.3.1.1 修改ego的pom.xml
... ...2.2.2....... org.quartz-schedulerquartz${quartz.version}
2.3.1.2 修改ego-order-web的pom.xml
......org.quartz-schedulerquartz
2.3.2 job类
继承job
public class JobDemo implements Job{@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {System.out.println(new Date()+"------------------------------------");}
}
2.3.3 测试类
public class QuartzTest {public static void main(String[] args) throws SchedulerException {/*** job:任务类 做什么事* trigger:触发器 什么时候做* scheduled:任务调度容器 什么时候做什么事*///创建job对象JobDetail job = JobBuilder.newJob(JobDemo.class).build();//创建trigger对象CronTrigger trigger = TriggerBuilder.newTrigger().withSchedule(CronScheduleBuilder.cronSchedule("*/1 * * * * ?")).build();//创建scheduled对象Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();scheduler.scheduleJob(job, trigger);//启动scheduler.start();}
}
2.4 Spring整合Quartz框架
2.4.1 job类
通过配置实现:
public class JobDemo2{public void execute(){System.out.println(new Date()+"------------------------------------");}
}
2.4.2 applicationContext-task.xml
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd">
2.4.3 测试类
public class QuartzTest2 {public static void main(String[] args) throws IOException {new ClassPathXmlApplicationContext("classpath:applicationContext-task.xml");System.in.read();}
}
三、 cron表达式
Cron 表达式是一个字符串,分为 6 或 7 个域,每一个域代表一个含义。
Cron 有如下两种语法格式:
- Seconds Minutes Hours Day Month Week Year
- Seconds Minutes Hours Day Month Week
3.1结构
corn 从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份
二、cron表达式
其中星期 1-7分别表示(周日-周六)
字段含义:
示例:
?:
“?”字符只在日期域或星期域中使用。它被用来指定“非明确的值”。两个域必有一个要用?
例如:
想在每月的20日凌晨触发调度:0 0 0 20 * ?,只能使用如下写法:0 0 0 20 * ?。其中星期域只能用?,而不能使 用*,因为*表示不管星期几都会触发恰好与20冲突。
想在每周三凌晨触发调度:0 0 0 0 * 4,只能使用如下写法:0 0 0 0 * 4。其中日期域只能用?,而不能使 用*,因为*表示日期会触发恰好与周三(4)冲突。
3. 关闭超时2天未付款的订单
3.1 分析
- 在订单系统中导入相关的依赖
- 定义job实现业务:
扫描订单表:
- 修改订单的状态为关闭状态,订单的结束时间、关闭时间、修改时间为当前时间;
- 把订单中商品的库存数量加回去;
- 扫描条件&#xff1a;状态是未付款 并且 创建时间 <&#61; 当前之间 – 2天 并且 付款方式为在线支付的订单。
3、 定义触发
- 理论上需要实时触发&#xff08;会出现性能问题&#xff09;&#xff1b;
- 实际操作1分钟触发一次。
3.2 实现关闭超时2天未付款的订单
3.2.1 job类
public class OrderQuartz {&#64;Autowired private OrderService orderService;public void closeTimeOutOrder(){//查询超时订单List tbOrders &#61; orderService.listTimeOutOrder();//关闭超时订单&#xff1a;改变status、updatatime、endtime、closetimefor(TbOrder tbOrder: tbOrders) {tbOrder.setStatus(6);tbOrder.setUpdateTime(new Date());tbOrder.setEndTime(new Date());tbOrder.setCloseTime(new Date());orderService.closeTimeOutOrder(tbOrder);//把订单库存量加回去List orderItemList &#61;orderService.loadOrderItemListService(tbOrder.getOrderId());for(TbOrderItem tbOrderItem: orderItemList) {orderService.addItemNum(tbOrderItem.getOrderId(),tbOrderItem.getNum());}}}
}
3.2.2 service
consumer端的servimpl相关方法&#xff1a;
//加载超时订单&#64;Overridepublic List listTimeOutOrder() {// TODO Auto-generated method stubreturn tbOrderServiceProxy.listTimeOutOrder();}//加载订单的内容&#64;Overridepublic List loadOrderItemListService(String orderid) {// TODO Auto-generated method stubreturn tbOrderServiceProxy.loadTbOrderItemListService(orderid);}//关闭超时订单。修改status、updatetime、endtime、closetime&#64;Overridepublic void closeTimeOutOrder(TbOrder tbOrder) {// TODO Auto-generated method stubtbOrderServiceProxy.closeTimeOutOrder(tbOrder);}//把库存熟练添加回去 &#64;Overridepublic void addItemNum(String orderId, Integer num) {// TODO Auto-generated method stubtbOrderServiceProxy.addItemNum(orderId, num);}
provide端的serviceimpl相关方法
&#64;Overridepublic List listTimeOutOrder() // TODO Auto-generated method stureturn tbOrderMapper.listTimeOutOrder();}&#64;Overridepublic List listOrderItem(String orderid) {TbOrderItemExample tbOrderItemExample &#61; new TbOrderItemExample();Criteria criteria &#61; tbOrderItemExample.createCriteria();criteria.andOrderIdEqualTo(orderId);return tbOrderItemMapper.selectByExample(tbOrderItemExample);}&#64;Overridepublic void closeTimeOutOrder(TbOrder tbOrder) {// TODO Auto-generated method stubtbOrderMapper.updateByPrimaryKeySelective(tbOrder);}&#64;Overridepublic void addItemNum(String orderId, Integer num) {// TODO Auto-generated method stubTbItem item &#61; tbItemMapper.selectByPrimaryKey(Long.parseLong(orderId));item.setNum(num&#43;item.getNum());tbItemMapper.updateByPrimaryKeySelective(item);}
3.2.3 mapper
List listOvertimeOrder();
3.2.4 applicationContext-task.xml
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd">//一分钟触发一下