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;
}
}