定时任务分布式锁的一种实现(数据库锁)

       在集群环境下,若每一台机器都运行一个定时任务,会导致生产数据一致性问题,所以必须要实现一个锁。保证当时任务在同一时间段只能在一台机器上面运行。定时任务实现方式很多种,比较常用的有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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值