基于quartz的定时任务

1,配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd">

    <bean id="initDataService" class="com.maxxipoint.exchange.manager.filter.service.initDataService"></bean>

    <!--自动注册集享卡会员定时任务-->
    <bean id="autoRegistJXKMember" class="com.maxxipoint.exchange.manager.manage.AutoRegisterJXKMember">
        <constructor-arg index="0"><value>${register.mutexjob.exeip}</value></constructor-arg>
        <!-- <constructor-arg index="0"><value>10.40.37.13</value></constructor-arg> -->
    </bean>

    <!-- 配置目标任务要执行的方法 -->
    <bean id="autoRegistJXKTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <ref bean="autoRegistJXKMember"/>
        </property>
        <property name="targetMethod">
            <value>executeRegister</value>
        </property>
        <property name="concurrent" value="false"/>
    </bean>
    <!--配置定时任务相关属性,执行时间-->
    <bean id="autoRegistJXKTaskTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail">
            <ref bean="autoRegistJXKTask"/>
        </property>
        <!--cron表达式 -->
        <property name="cronExpression">
            <!--每5分钟运行一次,第1分钟开始 —>
            <!—- 此处修改执行的时间 -->
            <!--<value>59 59 23 * * ?</value>-->
            <value>0 0/2 * * * ?</value>
            <!-- <value>0 0 17 * * ?</value> -->
        </property>
        <property name="misfireInstruction" value="2"/>
    </bean>

    <!--总管理类,定时任务启动入口,没有这个配置,任务不会自动执行-->
    <bean id="registerStartQuartz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="autoStartup" value="true"/>
        <property name="triggers">
            <list>
                <ref bean="autoRegistJXKTaskTrigger"/>
            </list>
        </property>
    </bean>

2,定时任务父类抽象类,用于多个定时任务分别执行

package com.maxxipoint.exchange.manager;

import com.communion.server.framework.protocols.respones.DataResult;
import com.maxxipoint.exchange.manager.bean.ResponseBean;

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * 互斥定时任务抽象接口
 * 
 * @author samyin
 *
 */
public abstract class AbstractMutexJobIP {
	
	protected String exeServiceIp;
	
	public AbstractMutexJobIP(String exeServiceIp){
		this.exeServiceIp = exeServiceIp;
	}
	
	public String getExeServiceIp() {
		return exeServiceIp;
	}
	public void setExeServiceIp(String exeServiceIp) {
		this.exeServiceIp = exeServiceIp;
		this.exeServiceIp.trim();
	}

	public void execute() {
		try {
			InetAddress address = InetAddress.getLocalHost();
//			String hostName = address.getHostName();
//			String canonicalHostName = address.getCanonicalHostName();//主机别名
			String ip = address.getHostAddress();//获取IP地址
			
//			System.out.println( "hostName=" + hostName + 
//			"; 主机别名=" + canonicalHostName
//					+ ";ip=" + ip);
			
			ip = ip.trim();
			/*if(ip.toLowerCase().equals(exeServiceIp.toLowerCase()) == false){
				return ;
			}*/
			boolean flag = false;
			String[] executeips = exeServiceIp.toLowerCase().split(",");
			for(String executeip:executeips){
				if(executeip.equals(ip.toLowerCase())){
					flag = true;
				}
			}
			if(!flag){
				return ;
			}
			doExecute();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}

	}

	public void executeRegister() {
		try {
			InetAddress address = InetAddress.getLocalHost();
//			String hostName = address.getHostName();
//			String canonicalHostName = address.getCanonicalHostName();//主机别名
			String ip = address.getHostAddress();//获取IP地址

//			System.out.println( "hostName=" + hostName +
//			"; 主机别名=" + canonicalHostName
//					+ ";ip=" + ip);

			ip = ip.trim();
			/*if(ip.toLowerCase().equals(exeServiceIp.toLowerCase()) == false){
				return ;
			}*/
			boolean flag = false;
			String[] executeips = exeServiceIp.toLowerCase().split(",");
			for(String executeip:executeips){
				if(executeip.equals(ip.toLowerCase())){
					flag = true;
				}
			}
			if(!flag){
				return ;
			}
			doExecuteRegister();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}

	}
	protected abstract DataResult<ResponseBean> doExecuteRegister();
}

3,定时任务具体实现类

package com.maxxipoint.exchange.manager.manage;


import com.baidu.disconf.client.usertools.DisconfDataGetter;
import com.communion.server.framework.protocols.respones.DataResult;

import com.maxxipoint.exchange.dao.entity.*;
import com.maxxipoint.exchange.dao.mapper.FileRegisterDetailMapper;
import com.maxxipoint.exchange.dao.mapper.FileRegisterMapper;
import com.maxxipoint.exchange.manager.AbstractMutexJobIP;
import com.maxxipoint.exchange.manager.bean.ResponseBean;
import com.maxxipoint.exchange.manager.service.IRegisterMemberService;
import com.maxxipoint.exchange.manager.util.ResultEnum;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class AutoRegisterJXKMember extends AbstractMutexJobIP {
    private final static Logger log = LogManager.getLogger(AutoRegisterJXKMember.class);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
    DecimalFormat df = new DecimalFormat ("#,#");

    @Autowired
    private FileRegisterMapper fileRegisterMapper;

    @Autowired
    private FileRegisterDetailMapper fileRegisterDetailMapper;

    @Autowired
    private IRegisterMemberService registerMemberService;

    private static String SEPARATOR = System.getProperty("file.separator");
    private static String PATH ;
    private static String IP;
    private static String PORT;
    private static String USERNAME;
    private static String PASSWORD;
    private static String REGISTFILEPATH;

    static{
        PATH = "/data" + SEPARATOR + "files" + SEPARATOR+ "csv" + SEPARATOR + "export" + SEPARATOR;
//		PATH = "D:/";

        DisconfDataGetter disconfDataGetter = new DisconfDataGetter();
        Map<String,Object> map = disconfDataGetter.getByFile("application.properties");
        IP=String.valueOf(map.get("autoReconciliation.ftp.ip"));
        PORT=String.valueOf(map.get("autoReconciliation.ftp.port"));
        USERNAME=String.valueOf(map.get("autoReconciliation.ftp.username"));
        PASSWORD=String.valueOf(map.get("autoReconciliation.ftp.password"));
        REGISTFILEPATH=String.valueOf(map.get("autoReconciliation.ftp.registJXKFilePath"));
    }

    public AutoRegisterJXKMember(String exeServiceIp) {
        super(exeServiceIp);
    }

    @Override
    protected void doExecute() {

    }

//    @Transactional
    @Override
    protected DataResult<ResponseBean> doExecuteRegister() {
        //每日生成当天的文件名 格式:merchId_date_registerFTP
        //TODO:生成每日的文件名,存储到数据库中。
        DataResult<ResponseBean> dataResult = new DataResult<ResponseBean>();
        try{
            Map<String,Object> busMap = new HashMap<String,Object>();
            busMap.put("supportFtpFile",1);
            //1.DB读取FTP文件的商家列表
            List<BusinessInfo> businessInfoList = registerMemberService.selectBusinessByMap(busMap);
            if( null == businessInfoList || businessInfoList.size() == 0){
                log.info("需要上传FTP的商家列表为空");
                dataResult.setCode(ResultEnum.BUSINESS_DATA_EMPTY.getCode());
                dataResult.setMsg(ResultEnum.BUSINESS_DATA_EMPTY.getMsg());
                return dataResult;
            }
            //2.遍历各个商家,根据定义日期格式,生成规则为:merch_id+date+inx
            for (BusinessInfo businessInfo:businessInfoList){
                //将每日生成的文件名,新建文件记录
                FileRegister fileRegister = new FileRegister();
                String merch_id = businessInfo.getMerchId();
                String registeDate = sdf1.format(new Date());
                String fileName = merch_id +"_" + registeDate +"_"+ "A";
                fileRegister.setMerchId(merch_id);
                fileRegister.setRegistDate(new Date());
                fileRegister.setFileName(fileName);
                fileRegister.setCreateTime(new Date());
                fileRegister.setUpdateTime(new Date());
                int i = registerMemberService.insertBusiness(fileRegister);
                log.info("每日生成"+merch_id+"的商家的文件名结果:"+i);
            }
            //3.查找需要去FTP拉取文件的记录
            byte fileReadStatus = 0;
            List<FileRegister> fileRegisterList = registerMemberService.selectFileByFileReadStatus(fileReadStatus);
            if(null == fileRegisterList || fileRegisterList.size() == 0){
                log.info("需要到FTP拉取的文件列表为空");
                dataResult.setCode(ResultEnum.FILE_DATA_EMPTY.getCode());
                dataResult.setMsg(ResultEnum.FILE_DATA_EMPTY.getMsg());
                return dataResult;
            }

            for( FileRegister fileRegister : fileRegisterList){
                byte flag = 0;
                //开始执行读取FTP及自动注册逻辑
                dataResult = registerMemberService.doExecuteReal(fileRegister);

                //查询新增数据,如有异常,则将文件的状态改为异常状态,0 待读,1 读取完成, 2读取有异常
                Map<String,Object> fileDetailMap = new HashMap<String,Object>();
                fileDetailMap.put("fileRegisterId",fileRegister.getId());
                fileDetailMap.put("memberRegistStatus",2);
                List<FileRegisterDetail> fileRegisterDetailList = registerMemberService.selectFileDetailMap(fileDetailMap);
                if(fileRegisterDetailList != null && fileRegisterDetailList.size() >0){
                    flag = 2;
                }else {
                    if(dataResult.getCode().equals("00")){
                        flag = 1;
                    }
                }
                fileRegister.setFileReadStatus(flag);
                //遍历完当前文件,修改文件状态
                registerMemberService.updateFilereadStatus(fileRegister);
            }

        }catch (Exception e){
            e.printStackTrace();
            dataResult.setCode(ResultEnum.SYSTEM_ERROR.getCode());
            dataResult.setMsg(e.getMessage());
            return dataResult;
        }
        return dataResult;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_34545939/article/details/82800202