spring的定时任务

首先配置一个定时任务,0 35 13 * * *代表每天的下午13:25分到class="com.qianmo.qmyj.cache.impl.AutoTransImpl"执行定时任务  
 1 <!--开启任务注解扫描-->
 2 <task:annotation-driven/>
 3 <bean id="autoTransTask" class="com.qianmo.qmyj.cache.impl.AutoTransImpl"/>
 4 <task:scheduled-tasks>
 5     <!--此计划任务用于用户不给好评,从工人点击完工(7日后)自动 5星好评 并且 转账-->
 6     <task:scheduled ref="autoTransTask" method="executeAutoTrans" cron="0 35 13 * * *"/>
 7 </task:scheduled-tasks>
 8
 9 <!-- 启用spring事务处理(同一个service中有一条数据库操作失败,之前的方法全部回滚) -->
10 <tx:annotation-driven transaction-manager="transactionManager"/>
/*
* Package com.qianmo.qmyj.cache
* FileName: AutoTransImpl
* Author:   anpei
* Date:     2017/5/7 2:44
*/
package com.qianmo.qmyj.cache.impl;

import com.qianmo.qmyj.bean.dto.Evaluation;
import com.qianmo.qmyj.bean.dto.OrderInfo;
import com.qianmo.qmyj.bean.dto.UserInfo;
import com.qianmo.qmyj.cache.AutoTrans;
import com.qianmo.qmyj.common.Constants;
import com.qianmo.qmyj.common.Constants.autoTrans;
import com.qianmo.qmyj.common.Constants.orderFinishStat;
import com.qianmo.qmyj.common.Constants.orderStat;
import com.qianmo.qmyj.dao.EvaluationDao;
import com.qianmo.qmyj.dao.OrderInfoDao;
import com.qianmo.qmyj.dao.UserInfoDao;
import com.qianmo.qmyj.framework.ForMartUtil;
import com.qianmo.qmyj.framework.util.DataVerifyUtil;
import com.qianmo.qmyj.framework.util.QMDateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * FileName:    AutoTransImpl
 * Author:      anpei
 * Date:        2017/5/7
 * Description: 自动转账以及好评(7日)
 */
@Component("autoTrans")
public class AutoTransImpl implements AutoTrans {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Resource
    private OrderInfoDao orderInfoDao;
    @Resource
    private UserInfoDao userInfoDao;
    @Resource
    private EvaluationDao evaluationDao;

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public int executeAutoTrans() {
        logger.info("---------------->处理自动转账五星好评业务处理开始:" + QMDateUtil.getYYYY_MM_DD_HH_MM_SS_CN() + "<------------");
        long startTime = System.currentTimeMillis();
        /*搜索订单状态:已完成;支付状态:已支付;并且订单好评转账时间字段为null,的所有订单  String orderType,String txnType,*/
        List<OrderInfo> oderInfoList = orderInfoDao.getOrderInfoByOrderStatOrderFinishStat(Constants.orderTypes.wechat,Constants.txnType.PAY,orderStat.SUCCESS, orderFinishStat.FINISHED_ORDERS);
        int count = autoTrans.ZERO_COMMIT;
        if (DataVerifyUtil.isEmptyList(oderInfoList)) {
            logger.info("---->没有检测出需要自动转账五星好评的订单,共处理【" + count + "】笔。本次定时任务结束" + QMDateUtil.getYYYY_MM_DD_HH_MM_SS_CN() + "<-----");
            return count;
        }
        logger.info("-------------->列表不为空,说明有初步符合条件的订单<-------------");
        String targetWorkerId = "";//接单工人id
        String transAmt = "";//订单交易金额
        String currentBal = "";//现有余额
        String executedBal = "";//增加以后的余额
        UserInfo userInfo;
        Evaluation evaluation = new Evaluation();
        for (OrderInfo orderInfo : oderInfoList) {
            if (Integer.parseInt(QMDateUtil.getYYYYMMDD())>Integer.parseInt(orderInfo.getAutoTransDateTime().substring(autoTrans.SUB_PREFIX, autoTrans.SUB_SUFFIX)) /*(orderInfo.getAutoTransDateTime().substring(autoTrans.SUB_PREFIX, autoTrans.SUB_SUFFIX)).compareTo(QMDateUtil.getYYYYMMDD()) == 0*/) {
                /*这些订单的自动转账好评日期已经等于7天*/
                targetWorkerId = orderInfo.getUserId();//接单工人id
                transAmt = orderInfo.getOrderTxnAmt();//订单交易金额
                userInfo = userInfoDao.getCustomerInfoById(targetWorkerId);
                currentBal = userInfo.getAcctBal();//现有余额
                executedBal = ForMartUtil.forMart(Double.parseDouble(transAmt) + Double.parseDouble(currentBal));//增加以后的余额
                userInfo.setAcctBal(executedBal);//赋予新的余额值
                //一开始的总星级
                int allStar = Integer.parseInt(userInfo.getAllStar());
                int s = Integer.parseInt(userInfo.getAvgStart());//一开始的平均星级
                int sumOrder = Constants.score.zero;//单数 默认为0
                if (s == Constants.score.zero || allStar == Constants.score.zero){//如果是第一单,则单数为0
                    sumOrder = Constants.score.zero;
                }else{ //否则计算
                    sumOrder = allStar / s * Constants.evaluation.sumtype;
                }
                //平均星级等于 总星级/ 单数 * 6
                allStar = allStar + Integer.parseInt(Constants.evaluation.totalRank);//总星级
                int avgStart = allStar / ((sumOrder+Constants.score.one)*Constants.evaluation.sumtype);

                userInfo.setAllStar(String.valueOf(allStar));//总星级
                userInfo.setAvgStart(String.valueOf(avgStart));//平均星级
                // TODO: Rust 2017/5/9 仅作测试,后期要删
//                logger.info("transAmt:" + transAmt);
//                logger.info("currentBal:" + currentBal);
//                logger.info("executeBal:" + executedBal);
                /*处理五星好评*/
                evaluation.setEvaluationDateTime(QMDateUtil.getYYYYMMDDHHMMSS());
                evaluation.setTotalStartCount(Constants.evaluation.totalRank);
                evaluation.setStarsCarefully(Constants.evaluation.star);
                evaluation.setStarsClothAttire(Constants.evaluation.star);
                evaluation.setStarsEmpCard(Constants.evaluation.star);
                evaluation.setStarsOnTime(Constants.evaluation.star);
                evaluation.setStarsPoliteness(Constants.evaluation.star);
                evaluation.setStarsQualified(Constants.evaluation.star);
                evaluation.setEvaluationContent("此用户暂无评价");
                evaluation.setEvaluationRank("好评");
                evaluation.setUserId(targetWorkerId);
                if (1 > evaluationDao.InsertEvaluation(evaluation)) {
                    logger.error("-------------->将信息插入评论表失败,处理自动五星好评失败<---------");
                    return count;
                }
                logger.info("-------------->将信息插入评论表成功,处理自动五星好评成功<---------");
                logger.info("-------------->对原订单表进行更新操作,orderFinishStat<-----------");
                orderInfo.setOrderFinishStat(Constants.orderFinishStat.ALREADY_PAY);
                if (1 > orderInfoDao.updateOrderinfoStatus(orderInfo)) {
                    logger.error("---------------->更新订单完成状态为 03:已到账,失败!<------------");
                    return count;
                }
                logger.info("--------------->开始执行余额增加操作<-------------");
                if (1 > userInfoDao.updateCustomerInfo(userInfo)) {
                    logger.error("------------------>数据库更新用户余额字段    【FAIL】<--------------");
                    return count;
                }
                logger.info("------------------>数据库更新用户余额字段     【SUCCESS】<-----------------");
                ++count;
            }
        }
        logger.info("--------------->所有符合自动转账五星好评的订单处理完毕<-----------");
        long endTime = System.currentTimeMillis();
        logger.info("----------->定时任务结束!本次共执行[" + count + "]笔更新操作,耗时(" + (endTime - startTime + "ms)<------------"));
        return count;
    }

}
 
时间: 2024-10-06 17:29:37

spring的定时任务的相关文章

Spring Task定时任务

Spring Task定时任务 1.基于Spring Task的任务调度方法: Spring框架自带的异步执行(TaskExecutor)和任务调度(TaskScheduler)接口. Spring Task官方地址: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html 以下是task任务调度配置:spring-tasks.xml <?xml version="1

Spring Quartz定时任务不准时执行

1. 前言 也是前段时间工作上遇到过这样的问题:quartz定时任务没有在预期的时间执行.后来研究了下quartz的机制,查明了原因,这里做个记录和分享. 2. 原因解释 先看一下spring quartz的大致机制或者说原理.quartz任务由一个主线程和线程池中的多个具体的工作线程构成. 主线程是QuartzSchedulerThread, 主要负责获取具体的定时任务和该任务执行的时间(比如可以通过cron expression 得到时间),并分发任务给线程池. 具体的任务由线程池中的工作线

Spring Task定时任务的配置和使用详解

spring中使用定时任务 1.基于xml配置文件使用定时任务 首先配置spring开启定时任务 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:task

Java spring quartz 定时任务

首先,需要导入quartz 的jar包 ① applicationContext.xml <!-- 轮询任务 --> <import resource="classpath:/conf/quartz/ctmanage-schedule.xml" /> ② ctmanage-schedule.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&q

spring quartz 定时任务“Failed to load class &quot;org.slf4j.impl.StaticLoggerBinder”“Checking for available updated version of Quartz”

Failed to load class "org.slf4j.impl.StaticLoggerBinder 需要slf4j-api.jar.slf4j-log4j12.jar Checking for available updated version of Quartz 添加系统属性 System.setProperty("org.terracotta.quartz.skipUpdateCheck", "true"); spring quartz 定

Spring - spring task 定时任务

spring task 实现定时任务 由于Spring3.0以后自带spring task定时任务工具,使用方法也非常简单,在Spring的架构下不需要额外引入其他jar包,同时还支持注解和配置文件两种形式. 一.注解方式配置(@Scheduled) 1.编写定时任务实体类 @Component public class SpringTaskJob { /* * cron : 秒,分,时,日,月,星期,年(可选) */ @Scheduled(cron = "0/5 * * * * ?"

spring @Scheduled定时任务使用说明及基本工作原理介绍

使用说明及工作原理: package com.example.spring.async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import com.example.spring.MyLog; /** * 定时任务使用示例 * 1.启动类增加注解 @EnableScheduling * 2.相应类声明为服务 @Servic

spring实现定时任务的两种方式

? Java? 方式一:注解 1.在spring配置文件中加入task的命名空间 123 xmlns:task="http://www.springframework.org/schema/task" http:http://www.springframework.org/schema/task/spring-task-3.0.xsd 2.配置扫描注解 12 <task:annotation-driven /><context:component-scan base-

Spring quartz定时任务service注入问题

今天想单元测试一下spring中的quartz定时任务,一顿折腾,到最后总是发现job类里注入的service为null.一开始还以为spring的配置问题,各种找原因,最后还是确定是没有注入. 就去网上搜搜吧.也找出来一些眉目.简单的理解这个原因是job是在quartz中实例化出来的,不受spring的管理.所以就导致注入不进去了.参考这个文章 http://www.tuicool.com/articles/Qjyamu 找着试试的态度,就按照文章里说的.new一个类 public class

Spring+Quartz(定时任务)

1.通过maven导入需要jar <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">