Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Acionando um programa Java com base em atualizações de banco de dados e intervalo de tempo


Escreva um único trabalho. Faça com que ele seja executado regularmente.

Efetivamente, você estará fazendo algo da natureza de:
SELECT count(*) FROM table WHERE new = 1;

(como queiras)

Execute isso a cada segundo, 5 segundos, 10 segundos, o que parecer razoável com base em sua atividade.

Quando count ==N, execute seu processo. Quando "tempo desde a última execução" ==5 minutos, execute seu processo.

O processo é o mesmo, basta verificar com mais frequência com os dois critérios.

Isso oferece uma vantagem de que você não terá uma condição de corrida desonesta onde o trabalho é disparado DUAS VEZES (porque o Trabalho A encontrou a contagem de inserções que por acaso foi de 5 minutos desde quando o último trabalho foi executado). Raro, sim, mas as condições de corrida sempre parecem buscar ativamente eventos "raros" que "nunca acontecem".

Quanto ao agendamento, um crontab é fácil porque você não precisa manter seu processo, mantê-lo ativo, daemonizar, etc. etc.

Se você já estiver executando em um contêiner de longa execução (servidor de aplicativos, tomcat, etc.), esse problema já está resolvido e você pode aproveitar isso.

A desvantagem do cron é sua granularidade, ele é executado no máximo a cada minuto. Se isso for muito longo, não funcionará para você. Mas se estiver tudo bem, então há um valor real em ter um processo simples que apenas acende, verifica e encerra. Claro, ele terá que persistir em seu estado de alguma forma (pode procurar em um log de trabalho para ver quando o último trabalho foi executado, por exemplo).

Dentro do java, existem muitas opções:encadeamentos brutos, dormindo, Timers, ScheduledExecutorService, algo como Quartz, EJB Timer beans (se você estiver executando um contêiner Java EE).

Mas, eu sou um fã do KISS. Se um cron job puder fazer isso, deixe-o e faça-o uma vez.