色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot 集成 ShedLock 分布式鎖的示例詳解

瀏覽:3日期:2023-12-13 09:57:18
目錄一:ShedLock 簡介二:配置maven 依賴三:SchedulerLock 基于 Redis 的配置四:在啟動(dòng)類中添加 @EnableScheduling 標(biāo)簽五:test 測試案例一:ShedLock 簡介

ShedLock是一個(gè)在分布式環(huán)境中使用的定時(shí)任務(wù)框架,用于解決在分布式環(huán)境中的多個(gè)實(shí)例的相同定時(shí)任務(wù)在同一時(shí)間點(diǎn)重復(fù)執(zhí)行的問題。ShedLock確保計(jì)劃的任務(wù)最多同時(shí)執(zhí)行一次。如果一個(gè)任務(wù)正在一個(gè)節(jié)點(diǎn)上執(zhí)行,它會(huì)獲得一個(gè)鎖,該鎖將阻止從另一個(gè)節(jié)點(diǎn)(或線程)執(zhí)行同一任務(wù)。請(qǐng)注意,如果一個(gè)任務(wù)已經(jīng)在一個(gè)節(jié)點(diǎn)上執(zhí)行,則在其他節(jié)點(diǎn)上的執(zhí)行不會(huì)等待,只是將其跳過。。簡單來說,ShedLock本身只做一件事情:保證一個(gè)任務(wù)最多同時(shí)執(zhí)行一次。所以如官網(wǎng)所說的,ShedLock不是一個(gè)分布式調(diào)度器,只是一個(gè)鎖!

注意:ShedLock支持Mongo,Redis,Hazelcast,ZooKeeper以及任何帶有JDBC驅(qū)動(dòng)程序的東西。本例子使用的是基于Redis的方式。之所以不適用基于jdbc存儲(chǔ)的主要原因是考慮到大量數(shù)據(jù)下的數(shù)據(jù)庫壓力的原因,若本身基于jdbc等,可直接參考官網(wǎng)給出的提示:

創(chuàng)建對(duì)應(yīng)的表結(jié)構(gòu)。

CREATE TABLE shedlock( name VARCHAR(64), lock_until TIMESTAMP(3) NULL, locked_at TIMESTAMP(3) NULL, locked_by VARCHAR(255), PRIMARY KEY (name))二:配置maven 依賴

<dependency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-spring</artifactId> <version>2.3.0</version></dependency><dependency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-provider-redis-spring</artifactId> <version>2.3.0</version></dependency><!--spring2.0集成redis所需common-pool2 --><!-- 必須加上,jedis依賴此 若項(xiàng)目中已經(jīng)引入jedis 請(qǐng)忽略此步驟--><!-- spring boot 2.0 的操作手冊(cè)有標(biāo)注 大家可以去看看 地址是:https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/ --><dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId></dependency>

添加jedis 依賴 若項(xiàng)目中已經(jīng)引入jedis 請(qǐng)忽略此步驟

<!--spring2.0集成redis所需common-pool2 --><!-- 必須加上,jedis依賴此 若項(xiàng)目中已經(jīng)引入jedis 請(qǐng)忽略此步驟--><dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId></dependency>三:SchedulerLock 基于 Redis 的配置

配置 lockProvider 并且開啟 @EnableSchedulerLock 標(biāo)簽

import net.javacrumbs.shedlock.core.LockProvider;import net.javacrumbs.shedlock.provider.redis.spring.RedisLockProvider;import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;/** * @Description SchedulerLock 基于 Redis 的配置 * @Author * @Date 2020/2/22 18:27 **/@Configuration//defaultLockAtMostFor 指定在執(zhí)行節(jié)點(diǎn)結(jié)束時(shí)應(yīng)保留鎖的默認(rèn)時(shí)間使用ISO8601 Duration格式//作用就是在被加鎖的節(jié)點(diǎn)掛了時(shí),無法釋放鎖,造成其他節(jié)點(diǎn)無法進(jìn)行下一任務(wù)//這里默認(rèn)55s//關(guān)于ISO8601 Duration格式用的不到,具體可上網(wǎng)查詢下相關(guān)資料,應(yīng)該就是一套規(guī)范,規(guī)定一些時(shí)間表達(dá)方式@EnableSchedulerLock(defaultLockAtMostFor = 'PT55S')public class ShedLockRedisConfig { @Value('${spring.profiles.active}') private String env; @Bean public LockProvider lockProvider(RedisConnectionFactory connectionFactory) {//環(huán)境變量 -需要區(qū)分不同環(huán)境避免沖突,如dev環(huán)境和test環(huán)境,兩者都部署時(shí),只有一個(gè)實(shí)例進(jìn)行,此時(shí)會(huì)造成相關(guān)環(huán)境未啟動(dòng)情況return new RedisLockProvider(connectionFactory, env); }}四:在啟動(dòng)類中添加 @EnableScheduling 標(biāo)簽

注意,要在啟動(dòng)類上添加 @EnableScheduling ,表明開啟定時(shí)器服務(wù)。若不加定時(shí)器是不會(huì)起效的。

@SpringBootApplication@EnableSchedulingpublic class EpidemicMessageApplication { public static void main(String[] args) {SpringApplication.run(EpidemicMessageApplication.class, args); }}五:test 測試案例

//區(qū)分服務(wù) @Value('${server.port}') private String port;@Scheduled(cron = '0 */1 * * * ?') /** * lockAtLeastForString的作用是為了防止在任務(wù)開始之初由于各個(gè)服務(wù)器同名任務(wù)的服務(wù)器時(shí)間差,啟動(dòng)時(shí)間差等這些造成的一些問題,有了這個(gè)時(shí)間設(shè)置后, * 就可以避免因?yàn)樯厦孢@些小的時(shí)間差造成的一些意外,保證一個(gè)線程在搶到鎖后,即便很快執(zhí)行完,也不要立即釋放,留下一個(gè)緩沖時(shí)間。 * 這樣等多個(gè)線程都啟動(dòng)后,由于任務(wù)已經(jīng)被鎖定,其他沒有獲得鎖的任務(wù)也不會(huì)再去搶鎖。注意這里的時(shí)間不要設(shè)置幾秒幾分鐘,盡量大些 *lockAtMostForString 這個(gè)設(shè)置的作用是為了防止搶到鎖的那個(gè)線程,因?yàn)橐恍┮馔馑赖袅耍i又始終不被釋放。 * 這樣的話,雖然當(dāng)前執(zhí)行周期雖然失敗了,但以后的執(zhí)行周期如果這里一直不釋放的話,后面就永遠(yuǎn)執(zhí)行不到了。 * 它的目的不在于隱藏任務(wù),更重要的是,釋放鎖,并且查找解決問題。 *至于是否帶有string后綴,只是2種表達(dá)方式,數(shù)字類型的就是毫秒數(shù),字符串類型的就有自己固定的格式 ,例如:PT30S 30s時(shí)間設(shè)置,單位可以是S,M,H */ @SchedulerLock(name = 'scheduledController_notice', lockAtLeastForString = 'PT15M', lockAtMostForString = 'PT14M') public StandardResult notice() {try { logger.info(port + '- 執(zhí)行定時(shí)器 scheduledController_notice'); return StandardResult.ok();} catch (Exception e) { logger.error('異常信息:', e); return StandardResult.faild('異常信息', e);} }

SchedulerLock注解說明@SchedulerLock注解一共支持五個(gè)參數(shù),分別是

name:用來標(biāo)注一個(gè)定時(shí)服務(wù)的名字,被用于寫入數(shù)據(jù)庫作為區(qū)分不同服務(wù)的標(biāo)識(shí),如果有多個(gè)同名定時(shí)任務(wù)則同一時(shí)間點(diǎn)只有一個(gè)執(zhí)行成功lockAtMostFor:成功執(zhí)行任務(wù)的節(jié)點(diǎn)所能擁有獨(dú)占鎖的最長時(shí)間,單位是毫秒mslockAtMostForString:成功執(zhí)行任務(wù)的節(jié)點(diǎn)所能擁有的獨(dú)占鎖的最長時(shí)間的字符串表達(dá),例如“PT14M”表示為14分鐘,單位可以是S,M,HlockAtLeastFor:成功執(zhí)行任務(wù)的節(jié)點(diǎn)所能擁有獨(dú)占所的最短時(shí)間,單位是毫秒mslockAtLeastForString:成功執(zhí)行任務(wù)的節(jié)點(diǎn)所能擁有的獨(dú)占鎖的最短時(shí)間的字符串表達(dá),例如“PT14M”表示為14分鐘,單位可以是S,M,H

到此這篇關(guān)于SpringBoot 集成 ShedLock 分布式鎖的文章就介紹到這了,更多相關(guān)SpringBoot 分布式鎖ShedLock內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 一级毛片免费不卡 | 暖暖日本在线播放 | 国内真实愉拍系列情侣自拍 | 92自拍视频 | 九九国产在线 | 国产综合精品久久亚洲 | 欧美成人在线免费观看 | 日韩欧美亚洲 | 99久久这里只精品国产免费 | 国产成人在线观看免费网站 | 国产精品九九视频 | 草草影 | 天堂视频免费看 | 亚洲美女在线播放 | 欧美一级艳片视频免费观看 | 日本一级特黄啪啪片 | 欧美综合图片一区二区三区 | 一级在线毛片 | 中文字幕日韩欧美一区二区三区 | 一级毛片在线不卡直接观看 | 午夜三级毛片 | 色香欲综合成人免费视频 | 最新久久免费视频 | 亚洲欧美日韩在线精品一区二区 | 欧美成人看片黄a免费 | 久久精品国产99久久72 | 亚洲第一色网 | 国内精品久久久久影院不卡 | 可以免费看黄的网站 | 高清国产一区 | 日韩毛片免费线上观看 | 男人的天堂2018 | 一级做a爰片久久毛片16 | 寡妇野外啪啪一区二区 | 一区二区三区免费视频网站 | 中文字幕亚洲综合久久男男 | 欧美成人午夜片一一在线观看 | 另类视频综合 | 国产免费一区二区三区 | 精品韩国主播福利视频在线观看一 | 国产99视频精品免费视频免里 |