ShedLock-jdbc配置鎖


     項目初期為了快速響應業務開發,對於部分業務需要使用到定時任務功能模塊,會直接嵌入到主流程代碼中間。當業務增加,發展成分布式服務時,那些定時任務對整體而言重復執行。如果避免分布式服務中的定時任務單一執行,又不需要重新遷移代碼另外新開定時任務項目呢?

   shedLock是個非常好的選擇。簡潔的配置,使用注解不干擾到業務即可實現。相對於其它實現方式而言是最簡單的。

   ShedLock可以保證多節點的計划任務同時只執行一次。使用加鎖機制讓其中一個節點運行計划任務,防止其它節點再次運行此計划任務,其它節點感知計划任務已加鎖,不會進行等待狀態,而是直接跳過。

  ShedLock使用外部存儲機制(如Mongo, JDBC database, Redis, Hazelcast, ZooKeeper)來協調。

  ShedLock並不是分布式鎖。它也不完全是分布式計划調度任務。

 

 

 

    ShedLock只是提供一種切入機制,真正實現鎖的機制由外部存儲來提供。ShedLock還有個比較人性化的點,配置參數中必需要有鎖的過期時間,防止死鎖。

使用ShedLock步驟:

1、配置並激活Scheduled locking

2、注解到計划任務上

3、配置鎖的提供者(JDBC、Redis、ZK)

演示如何使用JDBC來配置(非springBoot項目工程)。

添加依賴:

<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>4.0.3</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-jdbc-template</artifactId>
<version>4.0.3</version>
</dependency>
@EnableSchedulerLock(defaultLockAtMostFor = "PT30m")
public class ScheduleManager {

@Scheduled(cron = "1 1 */1 * * ?")
@SchedulerLock(name = "runSyncData",lockAtMostFor = "PT30m", lockAtLeastFor = "PT30s")
public void runSyncData(){
//......
}
}

PT為默認值,m/s表示時間單位

us:微秒
ns:納秒
ms:毫秒
s :秒
m :分鍾
h :小時
d :天


 Examples:

    "PT20.345S" -- parses as "20.345 seconds"
    "PT15M"     -- parses as "15 minutes" (where a minute is 60 seconds)
    "PT10H"     -- parses as "10 hours" (where an hour is 3600 seconds)
    "P2D"       -- parses as "2 days" (where a day is 24 hours or 86400 seconds)
    "P2DT3H4M"  -- parses as "2 days, 3 hours and 4 minutes"
    "P-6H3M"    -- parses as "-6 hours and +3 minutes"
    "-P6H3M"    -- parses as "-6 hours and -3 minutes"
    "-P-6H+3M"  -- parses as "+6 hours and -3 minutes"

lockAtMostFor:計划任務異常死亡后保留最長的時間,沒有配置會使用默認defaultLockAtMostFor的值。如果計划任務正常運行完后就會釋放鎖。此屬性時間盡量配置比正常運行時間長一些。

lockAtLeastFor:保留鎖的最小時間量。主要目的是防止多節點執行非常短的任務和節點之間的時鍾差異。

創建jdbc表

CREATE TABLE shed_lock(
name VARCHAR(64) NOT NULL COMMENT '鎖名稱',
lock_until TIMESTAMP(3) COMMENT '最大鎖保留時間',
locked_at TIMESTAMP(3) COMMENT '使用鎖時間',
locked_by VARCHAR(255) COMMENT '服務名稱',
PRIMARY KEY (name)
)ENGINE=INNODB DEFAULT CHARSET=UTF8MB4 ;

配置提供者

<bean id="lockProvider" class="net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider">
<constructor-arg name="dataSource" ref="dataSource"/>
</bean>

dataSource是必傳參數

如果不使用默認表名shed_lock,可以重置參數:<constructor-arg name="tableName" value="..."/>

 

 

---end---


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM