SpringBoot实现java分布式锁总结


前言

工作中需要在调度中加入分布式锁,通过shedlock表中插入同一个name(primary key),或者更新同一个name来抢锁


一、引入包

<!--springboot 调度加锁 -->
		 <dependency>
		  <groupId>net.javacrumbs.shedlock</groupId>
		  <artifactId>shedlock-spring</artifactId>
		  <version>4.19.1</version>
		</dependency>
		<dependency>
		   <groupId>net.javacrumbs.shedlock</groupId>
		   <artifactId>shedlock-provider-jdbc-template</artifactId>
		   <version>4.19.1</version>
		</dependency>

二、添加数据库表

CREATE TABLE shedlock(
NAME VARCHAR2(64),
lock_until TIMESTAMP(3) NULL,
locked_at TIMESTAMP(3) NULL,
locked_by VARCHAR(255),
PRIMARY KEY (NAME)
)

三、添加ShedLockConfig

import java.util.TimeZone;

import javax.sql.DataSource;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;

import net.javacrumbs.shedlock.core.LockProvider;
import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;

@Configuration
public class ShedLockConfig {
    @Bean
    public LockProvider lockProvider(final DataSource dataSource) {
        return new JdbcTemplateLockProvider(
                JdbcTemplateLockProvider.Configuration.builder()
                        .withJdbcTemplate(new JdbcTemplate(dataSource))
                        .withTimeZone(TimeZone.getTimeZone("GMT+8")) // 使用下面usingDbTime ,表中展示的时间不对
                        //.usingDbTime() // Works on Postgres, MySQL, MariaDb, MS SQL, Oracle, DB2, HSQL and H2
                        .build()
        );
    }
}

四、调度类加注解

import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;

@Component
public class Scheduler {
	/**
	 * 配置调度使用 . 
	 * 0 0 0,8,12,18 * * ?  -----每天0,8,12,18点执行 .
	 * 0 0 * * * ?			-----每个整点执行 .
	 * 0 0(*)/1 * * * ?     -----每分钟执行 .
	 * 0(*)/10 * * * * ?    -----每10秒执行 .
	 */
	@Scheduled(cron = "${jobs.main.cron}")
    @SchedulerLock(name = "test", lockAtMostFor = "60s", lockAtLeastFor = "10s") // 锁最多保持60秒,最少保持10秒
	public void testJob() {
		//执行调度
	}
}

五、启动类加注解

@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT50S")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值