分散ロックを必要とするアプリケーションのテストに関しては、Shed Lock は H2 データベースと効果的に統合できる強力なツールです。シェッド ロックのサプライヤーとして、私はこのようなロック メカニズムの実装とテストに伴う課題と機会を直接目の当たりにしてきました。このブログ投稿では、テスト目的で H2 データベースで Shed Lock を使用するプロセスについて説明します。
シェッドロックを理解する
Shed Lock は、Java アプリケーションのスケジュールされたタスクに分散ロックを提供するライブラリです。これにより、アプリケーションの複数のインスタンスにわたって特定のタスクが 1 回だけ実行されることが保証され、競合状態やその他の同時実行の問題が防止されます。これは、複数のノードが同じタスクを同時に実行しようとする分散システムでは非常に重要です。
Shed Lock の背後にある中心的な概念はシンプルです。データベースを使用してロック情報を保存します。タスクが実行されようとすると、データベース内のロックを取得しようとします。ロックが利用可能な場合、タスクは続行されます。それ以外の場合は、実行を待機するかスキップします。このメカニズムにより、一度に実行できるタスクのインスタンスは 1 つだけになります。


テストに H2 データベースを使用する理由
H2 データベースは、軽量、高速、セットアップが簡単なメモリ内データベースです。個別のサーバー プロセスが必要ないため、テスト環境に最適です。 Shed Lock をテストする場合、H2 データベースを使用すると、本格的なデータベース システムの管理にかかるオーバーヘッドなしで、テスト環境を迅速に起動できます。
プロジェクトのセットアップ
H2 データベースで Shed Lock の使用を開始するには、まず Java プロジェクトをセットアップする必要があります。 Maven や Gradle などのビルド ツールを使用できます。必要な依存関係を Maven プロジェクトに追加する方法の例を次に示します。
<dependency> <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> </dependency>
H2 データベースの構成
依存関係を追加したら、H2 データベースを構成する必要があります。 Spring Boot アプリケーションでは、これを行うことができます。アプリケーションのプロパティまたはアプリケーション.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 データベースがインメモリ モードで実行されるように構成します。のspring.h2.console.enabled=trueプロパティにより H2 コンソールが有効になり、デバッグに役立ちます。
シェッドロックの設定
次に、H2 データベースをロック プロバイダーとして使用するように Shed Lock を構成する必要があります。これを行うには、構成クラスを作成します。
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(new) JdbcTemplate(dataSource)) .usingDbTime() .build() ); } }
この構成クラスでは、ロックプロバイダーを使用する BeanJdbcTemplateLockProviderH2 データソースを使用します。の@EnableSchedulerLockアノテーションにより、Spring アプリケーションの Shed Lock 機能が有効になります。
スケジュールされたタスクの作成
次に、Shed Lock を使用する簡単なスケジュールされたタスクを作成しましょう。以下に例を示します。
net.javacrumbs.shedlock.spring.annotation.SchedulerLock をインポートします。 org.springframework.scheduling.annotation.Scheduled をインポートします。 org.springframework.stereotype.Component をインポートします。 @Component public class ScheduledTask { @Scheduled(fixedRate = 5000) @SchedulerLock(name = "scheduledTask", lockAtMostFor = "PT10S", lockAtLeastFor = "PT5S") public void runTask() { System.out.println("タスクは実行中です..."); } }
の@スケジュール済み注釈はタスクのスケジュールを定義します。@SchedulerLockアノテーションにより、タスクが複数のインスタンスにわたって 1 回だけ実行されることが保証されます。の名前の属性@SchedulerLock注釈はロックを識別するために使用され、ロックアットモスト用そして少なくともロック属性は、ロックが保持される最大および最小期間を定義します。
セットアップのテスト
セットアップをテストするには、Spring Boot アプリケーションを実行します。指定した間隔でタスクが実行されていることが確認でき、ロック メカニズムによりタスクが 1 回だけ実行されることが保証されます。 H2 コンソールを使用して、データベース内のロック エントリを確認することもできます。
高度なテストのシナリオ
基本的なテストに加えて、ロックの有効期限、同時アクセス、エラー処理などのより高度なシナリオをテストすることもできます。 JUnit や Mockito などのテスト フレームワークを使用して、これらのシナリオをシミュレートできます。
たとえば、単体テストを作成して、ロックが解除された後にロックが解放されることを確認できます。ロックアットモスト用間隔:
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 public class LockExpirationTest { @Autowired private LockProvider lockProvider; @Test public void testLockExpiration() { LockConfiguration lockConfig = new LockConfiguration(Instant.now(), "testLock", Duration.ofSeconds(5)); SimpleLock ロック = lockProvider.lock(lockConfig); assertNotNull(lock, "ロックを取得する必要があります"); { Thread.sleep(6000); を試してください。 } catch (InterruptedException e) { e.printStackTrace(); SimpleLock newLock = lockProvider.lock(lockConfig); assertNotNull(newLock, "ロックは有効期限が切れた後も利用可能である必要があります"); } }
結論
テストのために H2 データベースで Shed Lock を使用することは、分散ロック メカニズムの正確性を確認するための簡単で効果的な方法です。このブログ投稿で概説されている手順に従うことで、テスト環境を迅速にセットアップし、さまざまなシナリオをテストして、アプリケーションが期待どおりに動作することを確認できます。
Shed Lock ソリューションの購入に興味がある場合、または Shed Lock とアプリケーションの統合についてご質問がある場合は、私たちがお手伝いいたします。必要かどうか物置のドアロック物理的なセキュリティのため、またはクォーターターンロック特定のアクセス制御、または屋外ロック外部アプリケーションについては、当社の専門家チームが最適なソリューションを提供します。調達についての話し合いを開始し、お客様のニーズに合った適切な製品を見つけるには、お問い合わせください。
参考文献
- シェッドロック公式ドキュメント
- Spring Boot 公式ドキュメント
- H2データベースの公式ドキュメント
