عندما يتعلق الأمر باختبار التطبيقات التي تتطلب القفل الموزع، فإن Shed Lock هي أداة قوية يمكن دمجها بشكل فعال مع قاعدة بيانات H2. باعتباري أحد موردي Shed Lock، فقد شهدت بنفسي التحديات والفرص التي تأتي مع تنفيذ واختبار آليات القفل هذه. في منشور المدونة هذا، سأرشدك خلال عملية استخدام Shed Lock مع قاعدة بيانات H2 لأغراض الاختبار.
فهم قفل السقيفة
Shed Lock هي مكتبة توفر أقفالًا موزعة للمهام المجدولة في تطبيقات Java. فهو يضمن تنفيذ مهمة معينة مرة واحدة فقط عبر مثيلات متعددة للتطبيق، مما يمنع حالات السباق ومشكلات التزامن الأخرى. يعد هذا أمرًا بالغ الأهمية في الأنظمة الموزعة حيث قد تحاول العقد المتعددة تنفيذ نفس المهمة في وقت واحد.
المفهوم الأساسي وراء Shed Lock بسيط: فهو يستخدم قاعدة بيانات لتخزين معلومات القفل. عندما تكون المهمة على وشك التنفيذ، فإنها تحاول الحصول على قفل في قاعدة البيانات. إذا كان القفل متاحًا، فستستمر المهمة؛ وإلا فإنه ينتظر التنفيذ أو يتخطىه. تضمن هذه الآلية إمكانية تشغيل مثيل واحد فقط للمهمة في المرة الواحدة.


لماذا نستخدم قاعدة بيانات H2 للاختبار؟
قاعدة بيانات H2 هي قاعدة بيانات داخل الذاكرة تتميز بخفة وزنها وسرعتها وسهولة إعدادها. ولا يتطلب عملية خادم منفصلة، مما يجعله مثاليًا لبيئات الاختبار. عند اختبار Shed Lock، يتيح لك استخدام قاعدة بيانات H2 إمكانية تشغيل بيئة الاختبار بسرعة دون تحمل تكاليف إدارة نظام قاعدة بيانات كامل.
إعداد المشروع
لبدء استخدام Shed Lock مع قاعدة بيانات H2، تحتاج أولاً إلى إعداد مشروع Java. يمكنك استخدام أداة بناء مثل Maven أو Gradle. فيما يلي مثال لكيفية إضافة التبعيات الضرورية إلى مشروع Maven:
<dependeency> <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> </dependeency>
تكوين قاعدة بيانات H2
بمجرد إضافة التبعيات، تحتاج إلى تكوين قاعدة بيانات H2. في تطبيق Spring Boot، يمكنك القيام بذلك في ملفapplication.propertiesأوapplication.ymlملف. هنا مثال علىapplication.properties:
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، والتي يمكن أن تكون مفيدة لتصحيح الأخطاء.
تكوين قفل السقيفة
بعد ذلك، تحتاج إلى تكوين Shed Lock لاستخدام قاعدة بيانات H2 كموفر القفل. يمكنك القيام بذلك عن طريق إنشاء فئة التكوين:
import net.javacrumbs.shedlock.core.LockProvider; import net.javacrumbs.shedlock.provider.jdbc.template.JdbcTemplateLockProvider; import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; import 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() ); } }
في فئة التكوين هذه، نحدد أLockProviderالفول الذي يستخدمJdbcTemplateLockProviderمع مصدر البيانات H2. ال@EnableSchedulerLockيتيح التعليق التوضيحي وظيفة Shed Lock في تطبيق Spring.
إنشاء مهمة مجدولة
الآن، لنقم بإنشاء مهمة مجدولة بسيطة تستخدم Shed Lock. هنا مثال:
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock; import org.springframework.scheduling.annotation.Scheduled; import 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يضمن التعليق التوضيحي تنفيذ المهمة مرة واحدة فقط عبر مثيلات متعددة. الاسمسمة من@SchedulerLockيتم استخدام التعليق التوضيحي للتعرف على القفل، وlockAtMostForوlockAtLeastForتحدد السمات الحد الأقصى والحد الأدنى لمدة الاحتفاظ بالقفل.
اختبار الإعداد
لاختبار الإعداد، يمكنك تشغيل تطبيق Spring Boot. يجب أن ترى المهمة تعمل خلال الفاصل الزمني المحدد، ويجب أن تضمن آلية القفل تشغيلها مرة واحدة فقط. يمكنك أيضًا استخدام وحدة التحكم H2 للتحقق من إدخالات القفل في قاعدة البيانات.
سيناريوهات الاختبار المتقدمة
بالإضافة إلى الاختبار الأساسي، قد ترغب في اختبار سيناريوهات أكثر تقدمًا، مثل انتهاء صلاحية القفل والوصول المتزامن ومعالجة الأخطاء. يمكنك استخدام أطر عمل الاختبار مثل JUnit وMockito لمحاكاة هذه السيناريوهات.
على سبيل المثال، يمكنك كتابة اختبار وحدة للتحقق من تحرير القفل بعدlockAtMostForمدة:
import net.javacrumbs.shedlock.core.LockConfiguration; import net.javacrumbs.shedlock.core.LockProvider; import net.javacrumbs.shedlock.core.SimpleLock; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.time.Duration; import java.time.Instant; import static org.junit.jupiter.api.Assertions.assertNotNull; import static 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 lock = lockProvider.lock(lockConfig); تأكيدNotNull(lock, "يجب الحصول على القفل"); حاول { Thread.sleep(6000); } Catch (InterruptedException e) { e.printStackTrace(); } SimpleLock newLock = lockProvider.lock(lockConfig); تأكيدNotNull(newLock, "يجب أن يكون القفل متاحًا بعد انتهاء الصلاحية"); } }
خاتمة
يعد استخدام Shed Lock مع قاعدة بيانات H2 للاختبار طريقة مباشرة وفعالة لضمان صحة آليات القفل الموزعة. باتباع الخطوات الموضحة في منشور المدونة هذا، يمكنك إعداد بيئة اختبار بسرعة واختبار سيناريوهات مختلفة للتأكد من أن تطبيقك يعمل كما هو متوقع.
إذا كنت مهتمًا بشراء حلول Shed Lock أو لديك أي أسئلة حول دمج Shed Lock مع تطبيقك، فنحن هنا لمساعدتك. سواء كنت بحاجةأقفال أبواب السقيفةللأمن الجسدي أوقفل ربع دورةللتحكم في الوصول محددة، أو حتىقفل خارجيبالنسبة للتطبيقات الخارجية، يمكن لفريق الخبراء لدينا أن يقدم لك أفضل الحلول. اتصل بنا لبدء مناقشة المشتريات والعثور على المنتجات المناسبة لاحتياجاتك.
مراجع
- الوثائق الرسمية لـ Shed Lock
- الوثائق الرسمية لـ Spring Boot
- الوثائق الرسمية لقاعدة بيانات H2
