Cuando se trata de probar aplicaciones que requieren bloqueo distribuido, Shed Lock es una herramienta poderosa que se puede integrar efectivamente con una base de datos H2. Como proveedor de Shed Lock, he sido testigo de primera mano de los desafíos y oportunidades que conlleva la implementación y prueba de dichos mecanismos de bloqueo. En esta publicación de blog, lo guiaré a través del proceso de uso de Shed Lock con una base de datos H2 con fines de prueba.
Entendiendo la cerradura del cobertizo
Shed Lock es una biblioteca que proporciona bloqueos distribuidos para tareas programadas en aplicaciones Java. Garantiza que una tarea particular se ejecute solo una vez en múltiples instancias de una aplicación, evitando condiciones de carrera y otros problemas de concurrencia. Esto es crucial en sistemas distribuidos donde varios nodos pueden intentar ejecutar la misma tarea simultáneamente.
El concepto central detrás de Shed Lock es simple: utiliza una base de datos para almacenar información de la cerradura. Cuando una tarea está a punto de ejecutarse, intenta adquirir un bloqueo en la base de datos. Si el candado está disponible, la tarea continúa; de lo contrario, espera u omite la ejecución. Este mecanismo garantiza que solo se pueda ejecutar una instancia de la tarea a la vez.


¿Por qué utilizar la base de datos H2 para realizar pruebas?
La base de datos H2 es una base de datos en memoria que es liviana, rápida y fácil de configurar. No requiere un proceso de servidor independiente, lo que lo hace ideal para entornos de prueba. Al probar Shed Lock, el uso de una base de datos H2 le permite poner en marcha rápidamente un entorno de prueba sin la sobrecarga de administrar un sistema de base de datos completo.
Configurando el proyecto
Para comenzar a usar Shed Lock con una base de datos H2, primero debe configurar un proyecto Java. Puede utilizar una herramienta de compilación como Maven o Gradle. A continuación se muestra un ejemplo de cómo agregar las dependencias necesarias a un proyecto Maven:
<dependencias> <dependencia> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-spring</artifactId> <versión>4.44.0</versión> </dependencia> <dependencia> <groupId>net.javacrumbs.shedlock</groupId> <artifactId>shedlock-provider-jdbc-template</artifactId> <versión>4.44.0</versión> </dependencia> <dependencia> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <versión>2.1.214</versión> </dependencia> <dependencia> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependencia> </dependencias>
Configurar la base de datos H2
Una vez que se agregan las dependencias, debe configurar la base de datos H2. En una aplicación Spring Boot, puede hacer esto en elpropiedades.de.aplicaciónoaplicación.ymlarchivo. He aquí un ejemplo depropiedades.de.aplicación:
spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password=contraseña spring.h2.console.enabled=true
Estas propiedades configuran la base de datos H2 para que se ejecute en modo en memoria. Elspring.h2.console.enabled=verdaderoLa propiedad habilita la consola H2, que puede ser útil para la depuración.
Configurar el bloqueo del cobertizo
A continuación, debe configurar Shed Lock para utilizar la base de datos H2 como proveedor de cerraduras. Puedes hacer esto creando una clase de configuración:
importar net.javacrumbs.shedlock.core.LockProvider; importar net.javacrumbs.shedlock.provider.jdbc.template.JdbcTemplateLockProvider; importar net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; importar org.springframework.context.annotation.Bean; importar org.springframework.context.annotation.Configuration; importar org.springframework.jdbc.core.JdbcTemplate; importar javax.sql.DataSource; @Configuration @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") clase pública ShedLockConfig { @Bean public LockProvider lockProvider(DataSource dataSource) { return new JdbcTemplateLockProvider( JdbcTemplateLockProvider.Configuration.builder() .withJdbcTemplate(new JdbcTemplate(dataSource)) .usingDbTime() .construir() ); } }
En esta clase de configuración, definimos unProveedor de bloqueofrijol que utiliza elJdbcTemplateLockProvidercon la fuente de datos H2. El@EnableSchedulerLockLa anotación habilita la funcionalidad Shed Lock en la aplicación Spring.
Crear una tarea programada
Ahora, creemos una tarea programada simple que use Shed Lock. He aquí un ejemplo:
importar net.javacrumbs.shedlock.spring.annotation.SchedulerLock; importar org.springframework.scheduling.annotation.Scheduled; importar org.springframework.stereotype.Component; @Component public class ScheduledTask { @Scheduled(fixedRate = 5000) @SchedulerLock(name = "scheduledTask", lockAtMostFor = "PT10S", lockAtLeastFor = "PT5S") public void runTask() { System.out.println("La tarea se está ejecutando..."); } }
El@ProgramadoLa anotación define el cronograma de la tarea y el@ProgramadorLockLa anotación garantiza que la tarea se ejecute solo una vez en varias instancias. Elnombreatributo de la@ProgramadorLockLa anotación se utiliza para identificar la cerradura y elbloquear en la mayoría deybloquear al menos paraLos atributos definen la duración máxima y mínima durante la cual se mantiene el bloqueo.
Probando la configuración
Para probar la configuración, puede ejecutar la aplicación Spring Boot. Debería ver la tarea ejecutándose en el intervalo especificado y el mecanismo de bloqueo debería garantizar que se ejecute solo una vez. También puede utilizar la consola H2 para verificar las entradas de bloqueo en la base de datos.
Escenarios de prueba avanzados
Además de las pruebas básicas, es posible que desee probar escenarios más avanzados, como la caducidad del bloqueo, el acceso simultáneo y el manejo de errores. Puede utilizar marcos de prueba como JUnit y Mockito para simular estos escenarios.
Por ejemplo, puede escribir una prueba unitaria para verificar que el bloqueo se libere después de labloquear en la mayoría deduración:
importar net.javacrumbs.shedlock.core.LockConfiguration; importar net.javacrumbs.shedlock.core.LockProvider; importar net.javacrumbs.shedlock.core.SimpleLock; importar org.junit.jupiter.api.Test; importar org.springframework.beans.factory.annotation.Autowired; importar org.springframework.boot.test.context.SpringBootTest; importar java.time.Duration; importar java.time.Instant; importar estática org.junit.jupiter.api.Assertions.assertNotNull; importar estática org.junit.jupiter.api.Assertions.assertNull; @SpringBootTest clase pública LockExpirationTest { @Autowired lockProvider privado lockProvider; @Test public void testLockExpiration() { LockConfiguration lockConfig = new LockConfiguration(Instant.now(), "testLock", Duration.ofSeconds(5)); Bloqueo SimpleLock = lockProvider.lock(lockConfig); afirmarNotNull(bloqueo, "El bloqueo debe adquirirse"); prueba { Thread.sleep(6000); } captura (InterruptedException e) { e.printStackTrace(); } SimpleLock newLock = lockProvider.lock(lockConfig); afirmarNotNull(newLock, "El bloqueo debería estar disponible después de la expiración"); } }
Conclusión
Usar Shed Lock con una base de datos H2 para realizar pruebas es una forma sencilla y eficaz de garantizar la corrección de sus mecanismos de bloqueo distribuido. Si sigue los pasos descritos en esta publicación de blog, puede configurar un entorno de prueba rápidamente y probar varios escenarios para asegurarse de que su aplicación funcione como se espera.
Si está interesado en comprar soluciones Shed Lock o tiene alguna pregunta sobre la integración de Shed Lock con su aplicación, estamos aquí para ayudarlo. Si necesitasCerraduras para puertas de cobertizopor seguridad física oBloqueo de cuarto de vueltapara un control de acceso específico, o inclusoCerradura exteriorPara aplicaciones externas, nuestro equipo de expertos puede brindarle las mejores soluciones. Contáctenos para iniciar una discusión sobre adquisiciones y encontrar los productos adecuados para sus necesidades.
Referencias
- Documentación oficial de Shed Lock
- Documentación oficial de Spring Boot
- Documentación oficial de la base de datos H2
