Guia para ShedLock com Spring
1. Visão geral
O Spring fornece uma API fácil de implementar para agendar trabalhos. Funciona muito bem até implantarmos várias instâncias do nosso aplicativo. O Spring, por padrão, não pode manipular a sincronização do planejador em várias instâncias e executa os trabalhos simultaneamente em todos os nós.
Neste breve tutorial, veremos ShedLock - uma biblioteca Java que garante que nossas tarefas agendadas sejam executadas apenas uma vez ao mesmo tempoand is an alternative to Quartz.
2. Dependências do Maven
Para usar ShedLock com Spring, precisamos adicionar the shedlock-spring dependency:
net.javacrumbs.shedlock
shedlock-spring
2.2.0
3. Configuração
Note that ShedLock works only in environments with a shared database. Cria uma tabela ou documento no banco de dados onde armazena as informações sobre os bloqueios atuais.
Atualmente, o ShedLock suporta Mongo, Redis, Hazelcast, ZooKeeper e qualquer coisa com um driver JDBC.
Para este exemplo,we’ll use a PostgreSQL database. Para fazer funcionar, precisamos fornecerShedLock’s JDBC dependency:
net.javacrumbs.shedlock
shedlock-provider-jdbc-template
2.1.0
Em seguida, precisamos criar uma tabela de banco de dados para o ShedLock para manter as informações sobre os bloqueios do planejador:
CREATE TABLE shedlock(
name VARCHAR(64),
lock_until TIMESTAMP(3) NULL,
locked_at TIMESTAMP(3) NULL,
locked_by VARCHAR(255),
PRIMARY KEY (name)
)
Outro requisito de configuração que devemos fornecer são as anotações@EnableSchedulinge@EnableSchedulerLock em nossa classe de configuração Spring:
@SpringBootApplication
@EnableScheduling
@EnableSchedulerLock(defaultLockAtMostFor = "PT30S")
public class SpringApplication {
public static void main(String[] args) {
SpringApplication.run(SpringApplication.class, args);
}
}
O parâmetrodefaultLockAtMostFor especifica a quantidade padrão de tempo que o bloqueio deve ser mantido no caso de o nó em execução morrer. Ele usa o formatoISO8601 Duration.
Na próxima seção, veremos como substituir esse padrão.
4. Criando tarefas
Para criar uma tarefa agendada tratada pelo ShedLock, simplesmente colocamos as anotações@Schedulede@SchedulerLock em um método:
@Component
class TaskScheduler {
@Scheduled(cron = "*/15 * * * *")
@SchedulerLock(name = "TaskScheduler_scheduledTask",
lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M")
public void scheduledTask() {
// ...
}
}
Primeiro, vamos dar uma olhada em@Scheduled. Suportathe cron format, com esta expressão significando “a cada 15 minutos”.
Em seguida, dando uma olhada em@SchedulerLock,, o parâmetroname deve ser exclusivo eClassName_methodName normalmente é o suficiente para isso. Não queremos mais de uma execução desse método acontecendo ao mesmo tempo, e ShedLock usa o nome exclusivo para conseguir isso.
Também adicionamos alguns parâmetros opcionais.
Primeiro, adicionamoslockAtLeastForString para que possamos colocar alguma distância entre as invocações de método. Usar“PT5M” ignifica que este método irá segurar o bloqueio por 5 minutos, no mínimo. Em outras palavras,that means that this method can be run by ShedLock no more often than every five minutes.
Em seguida, adicionamoslockAtMostForString para especificar por quanto tempo o bloqueio deve ser mantido no caso de o nó em execução morrer. Usar“PT14M” ignifica que ele ficará bloqueado por no máximo 14 minutos.
Em situações normais, o ShedLock libera o bloqueio diretamente após o término da tarefa. Agora, realmente, não tivemos que fazer isso porquethere is a default provided in*@EnableSchedulerLock*,, mas optamos por substituir isso aqui.
5. Conclusão
Neste artigo, aprendemos como criar e sincronizar tarefas agendadas usando ShedLock.
Como sempre, todo o código-fonte está disponívelover on GitHub.