Когато става въпрос за тестване на приложения, които изискват разпределено заключване, Shed Lock е мощен инструмент, който може да бъде ефективно интегриран с H2 база данни. Като доставчик на Shed Lock бях свидетел от първа ръка на предизвикателствата и възможностите, които идват с прилагането и тестването на такива заключващи механизми. В тази публикация в блога ще ви преведа през процеса на използване на Shed Lock с H2 база данни за целите на тестването.
Разбиране на Shed Lock
Shed Lock е библиотека, която предоставя разпределени ключалки за планирани задачи в Java приложения. Той гарантира, че определена задача се изпълнява само веднъж в множество екземпляри на приложение, предотвратявайки условия на състезание и други проблеми с паралелността. Това е от решаващо значение в разпределени системи, където множество възли могат да се опитат да изпълнят една и съща задача едновременно.
Основната концепция зад Shed Lock е проста: тя използва база данни за съхраняване на информация за заключване. Когато дадена задача предстои да бъде изпълнена, тя се опитва да получи заключване в базата данни. Ако заключването е налично, задачата продължава; в противен случай изчаква или пропуска изпълнението. Този механизъм гарантира, че само едно копие на задачата може да се изпълнява в даден момент.


Защо да използвате H2 база данни за тестване?
Базата данни H2 е база данни в паметта, която е лека, бърза и лесна за настройка. Не изисква отделен сървърен процес, което го прави идеален за тестови среди. Когато тествате Shed Lock, използването на H2 база данни ви позволява бързо да завъртите среда за тестване без допълнителни разходи за управление на пълноценна система от бази данни.
Настройка на проекта
За да започнете да използвате Shed Lock с H2 база данни, първо трябва да настроите Java проект. Можете да използвате инструмент за изграждане като Maven или Gradle. Ето пример за това как да добавите необходимите зависимости към проект на Maven:
<dependencies> <dependency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-spring</artifactId> <version>4.44.0</version> </dependency> <dependency> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-provider-jdbc-template</artifactId> <version>4.44.0</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>2.1.214</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> </dependencies>
Конфигуриране на H2 база данни
След като се добавят зависимостите, трябва да конфигурирате H2 базата данни. В приложение за Spring Boot можете да направите това вприложение.свойстваилиapplication.ymlфайл. Ето един пример заприложение.свойства:
spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=парола spring.h2.console.enabled=true
Тези свойства конфигурират H2 базата данни да работи в режим in - memory. Thespring.h2.console.enabled=trueактивира H2 конзолата, която може да бъде полезна за отстраняване на грешки.
Конфигуриране на Shed Lock
След това трябва да конфигурирате Shed Lock да използва базата данни H2 като доставчик на заключване. Можете да направите това, като създадете конфигурационен клас:
импортиране net.javacrumbs.shedlock.core.LockProvider; импортиране net.javacrumbs.shedlock.provider.jdbc.template.JdbcTemplateLockProvider; импортиране net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; импортиране на org.springframework.context.annotation.Bean; импортиране на org.springframework.context.annotation.Configuration; импортиране на org.springframework.jdbc.core.JdbcTemplate; импортиране на javax.sql.DataSource; @Configuration @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") public class ShedLockConfig { @Bean public LockProvider lockProvider(DataSource dataSource) { return new JdbcTemplateLockProvider( JdbcTemplateLockProvider.Configuration.builder() .withJdbcTemplate(нов JdbcTemplate(dataSource)) .usingDbTime() .build()); }}
В този конфигурационен клас ние дефинираме aLockProviderбоб, който използваJdbcTemplateLockProviderс източника на данни H2. The@EnableSchedulerLockанотацията позволява функционалността Shed Lock в приложението Spring.
Създаване на планирана задача
Сега нека създадем проста планирана задача, която използва Shed Lock. Ето един пример:
импортиране net.javacrumbs.shedlock.spring.annotation.SchedulerLock; импортиране на org.springframework.scheduling.annotation.Scheduled; импортиране на org.springframework.stereotype.Component; @Component публичен клас ScheduledTask { @Scheduled(fixedRate = 5000) @SchedulerLock(name = "scheduledTask", lockAtMostFor = "PT10S", lockAtLeastFor = "PT5S") public void runTask() { System.out.println("Задачата се изпълнява..."); }}
The@Планираноанотацията определя графика за задачата и@SchedulerLockанотацията гарантира, че задачата се изпълнява само веднъж в множество екземпляри. Theимеатрибут на@SchedulerLockанотацията се използва за идентифициране на ключалката иlockAtMostForиlockAtLeastForатрибутите определят максималната и минималната продължителност, за която се задържа заключването.
Тестване на настройката
За да тествате настройката, можете да стартирате приложението Spring Boot. Трябва да видите задачата да се изпълнява на посочения интервал и механизмът за заключване трябва да гарантира, че тя се изпълнява само веднъж. Можете също да използвате конзолата H2, за да проверите записите за заключване в базата данни.
Разширени сценарии за тестване
В допълнение към основното тестване, може да искате да тествате по-усъвършенствани сценарии, като изтичане на заключването, едновременен достъп и обработка на грешки. Можете да използвате рамки за тестване като JUnit и Mockito, за да симулирате тези сценарии.
Например, можете да напишете единичен тест, за да проверите дали заключването е освободено следlockAtMostForпродължителност:
импортиране net.javacrumbs.shedlock.core.LockConfiguration; импортиране net.javacrumbs.shedlock.core.LockProvider; импортиране net.javacrumbs.shedlock.core.SimpleLock; импортиране на org.junit.jupiter.api.Test; импортиране на org.springframework.beans.factory.annotation.Autowired; импортиране на org.springframework.boot.test.context.SpringBootTest; импортиране на java.time.Duration; импортиране на java.time.Instant; импортиране на статичен org.junit.jupiter.api.Assertions.assertNotNull; импортиране на статичен org.junit.jupiter.api.Assertions.assertNull; @SpringBootTest публичен клас LockExpirationTest { @Autowired частен LockProvider lockProvider; @Test public void testLockExpiration() { LockConfiguration lockConfig = new LockConfiguration(Instant.now(), "testLock", Duration.ofSeconds(5)); SimpleLock заключване = lockProvider.lock(lockConfig); assertNotNull(заключване, "Заключването трябва да бъде придобито"); опитайте { Thread.sleep(6000); } catch (InterruptedException e) { e.printStackTrace(); } SimpleLock newLock = lockProvider.lock(lockConfig); assertNotNull(newLock, "Заключването трябва да е достъпно след изтичане"); }}
Заключение
Използването на Shed Lock с H2 база данни за тестване е лесен и ефективен начин да гарантирате коректността на вашите разпределени заключващи механизми. Като следвате стъпките, описани в тази публикация в блога, можете бързо да настроите среда за тестване и да тествате различни сценарии, за да сте сигурни, че вашето приложение работи според очакванията.
Ако се интересувате от закупуването на решения Shed Lock или имате въпроси относно интегрирането на Shed Lock с вашето приложение, ние сме тук, за да ви помогнем. Независимо дали имате нуждаБрави за врати на навесиза физическа сигурност илиЗаключване на четвърт оборотза специфичен контрол на достъпа или дориВъншно заключванеза външни приложения нашият екип от експерти може да ви предостави най-добрите решения. Свържете се с нас, за да започнем дискусия за поръчка и да намерим правилните продукти за вашите нужди.
Референции
- Официална документация на Shed Lock
- Официална документация на Spring Boot
- Официална документация на базата данни H2
