1、导入依赖
需要导入spring-context
依赖,但这个依赖已经在spring-boot-starter
起步依赖中包含了,如下:
2、在启动类上添加@EnableScheduling
注解,开启任务调度
less
@SpringBootApplication
@EnableScheduling // 开启任务调度
public class SkyApplication {
public static void main(String[] args) {
SpringApplication.run(SkyApplication.class, args);
}
}
3、自定义定时任务类
以订单的超时未支付时间为15分钟来举例。
订单状态已定义在Orders实体类中,如下:
ruby
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Orders implements Serializable {
/**
* 订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
*/
public static final Integer PENDING_PAYMENT = 1;
public static final Integer TO_BE_CONFIRMED = 2;
public static final Integer CONFIRMED = 3;
public static final Integer DELIVERY_IN_PROGRESS = 4;
public static final Integer COMPLETED = 5;
public static final Integer CANCELLED = 6;
/////////////////////////////////////////
// 略
/////////////////////////////////////////
}
自定义定时任务类:
less
@Component
@Slf4j
public class OrderTask {
@Autowired
private OrderMapper orderMapper;
// 超时未支付订单处理
// cron表达式,用来定义任务触发的时间,此处表示每分钟触发一次。该表达式怎么写,此处不赘述
@Scheduled(cron = "0 0/1 * * * ?")
public void processPayTimeOut(){
// 从订单表中查询哪些订单超时了,条件:status = 1 and order_time < 当前时间 - 15mins
LocalDateTime time = LocalDateTime.now().plusMinutes(-15);
List<Orders> ordersList = orderMapper.getByStatusAndCreateTimeLT(Orders.PENDING_PAYMENT, time);
if (ordersList != null && ordersList.size() > 0){
for (Orders order : ordersList) {
// 设置支付超时订单的状态为 6已取消
order.setStatus(Orders.CANCELLED);
order.setCancelTime(LocalDateTime.now());
order.setCancelReason("订单支付超时");
// 更新数据库中的数据
orderMapper.update(order);
}
}
}
}
OrderMapper:
java
@Mapper
public interface OrderMapper {
@Select("select * from orders where status = #{status} and order_time < #{time}")
List<Orders> getByStatusAndCreateTimeLT(Integer status, LocalDateTime time);
void update(Orders orders);
}
OrderMapper.xml:
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sky.mapper.OrderMapper">
<update id="update" parameterType="com.sky.entity.Orders">
update orders
<set>
<if test="cancelReason != null and cancelReason!='' ">
cancel_reason=#{cancelReason},
</if>
<if test="rejectionReason != null and rejectionReason!='' ">
rejection_reason=#{rejectionReason},
</if>
<if test="cancelTime != null">
cancel_time=#{cancelTime},
</if>
<if test="payStatus != null">
pay_status=#{payStatus},
</if>
<if test="payMethod != null">
pay_method=#{payMethod},
</if>
<if test="checkoutTime != null">
checkout_time=#{checkoutTime},
</if>
<if test="status != null">
status = #{status},
</if>
<if test="deliveryTime != null">
delivery_time = #{deliveryTime}
</if>
</set>
where id = #{id}
</update>
</mapper>