sql >> Database teknologi >  >> RDS >> Mysql

Udløsning af et Java-program baseret på databaseopdateringer og tidsinterval

Skriv et enkelt job. Få det til at udføre regelmæssigt.

Effektivt vil du gøre noget af arten af:

SELECT count(*) FROM table WHERE new = 1;

(eller hvad som helst)

Kør det hvert sekund, 5 sekunder, 10 sekunder, hvad der end synes rimeligt baseret på din aktivitet.

Når tæller ==N, kør din proces. Når "tid siden sidste kørsel" ==5 minutter, kør din proces.

Processen er den samme, du tjekker den bare oftere med de to kriterier.

Dette giver en fordel, at du ikke vil få en slyngel racetilstand, hvor jobbet affyres TO GANGE (fordi Job A fandt indsætningstallet, der tilfældigvis var 5 minutter fra det sidste job kørte). Sjældent, ja, men raceforhold ser altid ud til aktivt at søge "sjældne" begivenheder, der "aldrig sker".

Med hensyn til planlægning er en crontab let, fordi du ikke behøver at vedligeholde din proces, holde den i live, dæmonisere osv. osv.

Hvis du allerede kører i en langvarig container (app-server, tomcat osv.), er det problem allerede løst, og du kan bare udnytte det.

Ulempen ved cron er dets granularitet, den kører højst hvert minut. Hvis det er for længe, ​​virker det ikke for dig. Men hvis det er ok, så er der virkelig værdi i at have en simpel proces, der bare lyser op, tjekker den og stopper. Selvfølgelig skal det på en eller anden måde bevare sin tilstand (det kunne f.eks. kigge i en joblog for at se, hvornår det sidste job kørte).

Inden for java er der masser af muligheder:rå tråde, sove, timere, ScheduledExecutorService, noget som Quartz, EJB Timer bønner (hvis du kører en Java EE container).

Men jeg er KISS-fan. Hvis et cron-job kan gøre det, så lad det og gør det én gang.



  1. Hvordan overfører man DB AWS-hemmeligheden til tomcat context.xml?

  2. MySQL fjernforbindelse (replikering)

  3. mysql problemer med information_schema.tables

  4. Hvordan får man en værdi fra den sidst indsatte række?