前言
在项目中,经常会使用到定时任务来完成某个功能,在这里做个记录.
正文
spring中的定时任务使用很简单,只需要创建一个对应的类,在类中的execute
方法中写好对应的逻辑,并且在spring的配置文件中配置好即可,具体代码实例如下:
public class CloseOverPayJDTask {
protected static final Logger logger = Logger.getLogger(CloseOverPayTask.class);
@Resource
private XUCache<String> cacheService;
@Resource
private OrdersServiceHandler ordersServiceHandler;
private static final String cacheLockKey = "cloudplus_close_over_pay_jd_task";
/**
* 第小时处理一次
*/
public void execute() {
//再修改时间
boolean addResult = false;
try {
// 加锁: 放入一个锁,表示当前任务正在运行,防止另一台机器运行
addResult = cacheService.add(cacheLockKey, "true", 60 * 2);
if (!addResult) {
logger.info("[查询支付与退款结果任务]另一台机器正在执行任务,本次暂不执行");
return;
}
}
catch (Exception e) {
logger.error("[查询支付与退款结果任务]任务锁缓存异常:", e);
return;
}
logger.info("[查询支付与退款结果任务]开始执行!");
try {
ordersServiceHandler.closeOverPayJD();;
} catch (Exception e) {
logger.error("[查询支付与退款结果任务]出错!",e);
e.printStackTrace();
}
logger.info("[查询支付与退款结果任务]结束执行!");
}
}
注意,还需要在spring的配置文件中配置这个任务类
<task:scheduled-tasks>
<task:scheduled ref="closeOverPayJDTask" method="execute" cron="${task.close.over.pay.jd.crontab}" />
</task:scheduled-tasks>
在这里使用cron表达式来定义定时任务执行的频率,这个数据可以写在配置文件中,方便后期随时改变.
总结
实现定时任务的方式有很多,在这个代码中还加入了缓存,包装集群环境下,每次只有一台服务器来执行.