在集群环境下,若每一台机器都运行一个定时任务,会导致生产数据一致性问题,所以必须要实现一个锁。保证当时任务在同一时间段只能在一台机器上面运行。定时任务实现方式很多种,比较常用的有quartz、TBSchedule等等。低版本的quartz无法满足多个不同的任务同时进行并且不并发执行,尝试了很久quartz还是放弃了。
换了一种思路,自己实现了一种数据库锁的机制,需要创建两张表,一张表来控制任务,另外一张表来记录执行信息。
SQL脚本:
CREATE TABLE qrtz_basejob_config(
key_name varchar(255) DEFAULT '' NOT NULL,
actual_pre_time TIMESTAMP DEFAULT NULL ,
job_state varchar(4) DEFAULT '0' NOT NULL ,
create_time TIMESTAMP DEFAULT NULL,
PRIMARY KEY (key_name)
) ;
COMMENT ON table qrtz_basejob_config
IS
'baseJob配置表';
COMMENT ON column qrtz_basejob_config.key_name
IS
'参数code';
COMMENT ON column qrtz_basejob_config.actual_pre_time
IS
'上一次实际执行时间';
COMMENT ON column qrtz_basejob_config.job_state
IS
'状态--1代表正在执行0代表等待执行';
COMMENT ON column qrtz_basejob_config.create_time
IS
'创建时间';
CREATE TABLE qrtz_basejob_config_record (
id DECIMAL(20) NOT NULL ,
key_name varchar(255) DEFAULT NULL,
start_time timestamp DEFAULT NULL,
end_time timestamp DEFAULT NULL ,
cost_time DECIMAL(20) DEFAULT 0 ,
ip varchar(50) DEFAULT NULL,
create_time timestamp DEFAULT NULL,
PRIMARY KEY (id)
);
COMMENT ON table qrtz_basejob_config_record
IS
'定时任务运行记录表';
COMMENT ON column qrtz_basejob_config_record.id
IS
'主键';
COMMENT ON column qrtz_basejob_config_record.key_name
IS
'定时任务名称';
COMMENT ON column qrtz_basejob_config_record.start_time
IS
'定时任务开始时间';
COMMENT ON column qrtz_basejob_config_record.end_time
IS
'定时任务结束时间';
COMMENT ON column qrtz_basejob_config_record.cost_time
IS
'耗时';
COMMENT ON column qrtz_basejob_config_record.ip
IS
'运行服务器IP';
COMMENT ON column qrtz_basejob_config_record.create_time
IS
'创建时间';
公共任务类:
package com.service.schedulerLockJob.lockJob;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Component;
import com.log.ElectronicsLogger;
import com.service.schedulerLockJob.IBasicJobConfigService;
import com.util.SpringContextHolder;
/**
* 创建日期:2017-11-21上午10:28:36
* 修改日期:
* 作者:ttan
* 描述:
*/
@Component
public abstract class BasicJob{
/* @Autowired(required = false)
@Qualifier("basicJobConfigServiceImpl")
IBasicJobConfigService basicJobConfigService;*/
private IBasicJobConfigService basicJobConfigService = (IBasicJobConfigService) SpringContextHolder.getBean("basicJobConfigServiceImpl");
public static String IP_STRING = null;
static{
try {
InetAddress ip = InetAddress.getLocalHost();
IP_STRING = ip.getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
/**
*
* 创建日期:2017-11-21下午4:41:22
* 修改日期:
* 作者:ttan
* 描述:
* keyName:任务ID
* resetTime:设置的超时时间
*/
@SuppressWarnings({ "rawtypes", "un