19 Temmuz 2021 Pazartesi

SpringScheduling Shedlock Kullanımı

Giriş
Açıklaması şöyle. ShedLock kütüphanesi, distributed lock için veri tabanını kullanıyor.
ShedLock makes sure that your scheduled tasks are executed at most once at the same time. If a task is being executed on one node, it acquires a lock which prevents execution of the same task from another node (or thread). Please note, that if one task is already being executed on one node, execution on other nodes does not wait, it is simply skipped.
Açıklaması şöyle
The high level idea of ShedLock is pretty simple. When a given instance is executing a scheduler method of your application, a data source update call will happen with the provided configuration. The configuration will contain a unique name for the scheduler and also it contains 3 other columns lock_until, locked_at, and locked_by. If another instance tries to run the same scheduler method, the first step is to check if it is locked, in case it is locked, then it will not be executed.
Maven
Shedlock 3 kısımdan oluşuyor
1. Core
2. Integration 
3. Lock Provider
Integration ile Core bağımlılığı da geliyor. Lock Provider bağımlılığı ile de arkada kullanılacak veri tabanı seçiliyor.

Örnek - Spring
Şu satırı dahil ederiz. Lock provider olarak kullanılacak kütüphaneyi de dahil etmek gerekiyor. Burada Lock provider olarak JDBC kullanılıyor.
<dependency>
  <groupdId>net.javacrumbs.shedlock</groupdId>
  <artifactId>shedlock-spring</artifactId>
  <version>4.23.0</version>
</dependency>
<dependency>
  <groupdId>net.javacrumbs.shedlock</groupdId>
  <artifactId>shedlock-provider-jdbc-template</artifactId>
  <version>4.23.0</version>
</dependency>
Gradle
Şu satırı dahil ederiz
implementation 'net.javacrumbs.shedlock:shedlock-spring:5.3.0'
implementation 'net.javacrumbs.shedlock:shedlock-provider-jdbc-template:5.3.0'
Daha sonra bir tablo oluştururuz
CREATE TABLE shedlock(name VARCHAR(64) NOT NULL, lock_until TIMESTAMP(3) NOT NULL,
  locked_at TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
locked_by VARCHAR(255) NOT NULL, PRIMARY KEY (name));
Kullanım
1. Spring'e ait @EnableScheduling anotasyonunun olduğu koda ilave olarak @EnableSchedulerLock anotasyonu tanımlanır. Burada varsayılan ayarlar belirtiliyor
Yani şöyle yaparız
@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "10m")
class MySpringConfiguration {
    ...
}
2. Bir LockProvider tanımlanır. Açıklaması şöyle
You’ll need to create a LockProvider bean and specify which lock providers to use (e.g., database-backed locks, ZooKeeper, Redis, etc.).
Lock provider olarak bir sürü farklı şey kullanılabiliyor. Liste burada
JdbcTemplateLockProvider yazısına bakabilirsiniz

3. Spring'e ait @Scheduled anotasyonunun olduğu koda anotasyon olarak @SchedulerLock Anotasyonu ilave edilir. Yani şöyle yaparız
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;

...

@Scheduled(...)
@SchedulerLock(name = "scheduledTaskName")
public void scheduledTask() {
    // To assert that the lock is held (prevents misconfiguration errors)
    LockAssert.assertLocked();
    // do something
}
@EnableSchedulerLock Anotasyonu
Açıklaması şöyle
We need to enable Shedlock with a default lock for a maximum of 5 minutes.
...
Thus, during the next tick of the scheduler, each instance will try to write a line about itself in the lock table, and the first one who succeeds will continue executing the task. Everyone else will skip the tick.

Lock on the task will hang in our case for a maximum of 5 minutes. Upon completion of the task, the instance will remove the lock in the table. If 5 minutes have passed and the lock has not been removed, other instances will consider that that instance has frozen while the task is being executed.
defaultLockAtLeastFor Alanı
Örnek
Şöyle yaparız
@Configuration
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor="PT20s",defaultLockAtLeastFor="PT5s")
public class SchedulerConfiguration {

  @Bean
  public LockProvider lockProvider(DataSource dataSource) {
    return new JdbcTemplateLockProvider(
      JdbcTemplateLockProvider.Configuration.builder()
        .withJdbcTemplate(new JdbcTemplate(dataSource))
        .build()
    );
  }
}
defaultLockAtMostFor Alanı
Örnek
Şöyle yaparız
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "5m")
public class ApplicationConfiguration {
}
Örnek
Şöyle yaparız
@EnableSchedulerLock(defualtLockAtMostFor = "PT45S",defaultLockAtLeastFor = "PT45S")
@Configuration
public class SchedulerLockConfig {
  ...
}

Hiç yorum yok:

Yorum Gönder