sql >> Database >  >> RDS >> Mysql

Een Java-programma activeren op basis van database-updates en tijdsinterval

Schrijf een enkele baan. Laat het regelmatig uitvoeren.

In feite doe je iets van de aard van:

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

(of wat dan ook)

Voer dat elke seconde, 5 seconden, 10 seconden uit, wat redelijk lijkt op basis van je activiteit.

Wanneer count ==N, voert u uw proces uit. Wanneer "tijd sinds laatste run" ==5 minuten, voer je proces uit.

Het proces is hetzelfde, je controleert het alleen vaker met de twee criteria.

Dit biedt het voordeel dat je geen malafide race-conditie krijgt waarbij de taak TWEE KEER wordt geactiveerd (omdat Job A het aantal invoegingen ontdekte dat toevallig 5 minuten was vanaf het moment waarop de laatste taak werd uitgevoerd). Zeldzaam, ja, maar raceomstandigheden lijken altijd actief te zoeken naar "zeldzame" gebeurtenissen die "nooit gebeuren".

Wat het plannen betreft, een crontab is eenvoudig omdat je je proces niet hoeft te onderhouden, in leven te houden, te demoniseren, etc. etc.

Als je al in een langlopende container draait (app-server, tomcat, enz.), dan is dat probleem al opgelost en kun je daar gewoon gebruik van maken.

Nadeel van cron is de granulariteit, het werkt maximaal elke minuut. Als dat te lang duurt, werkt het niet voor jou. Maar als het goed is, dan is het echt waardevol om een ​​eenvoudig proces te hebben dat gewoon oplicht, controleert en stopt. Natuurlijk moet het op de een of andere manier zijn status behouden (het kan bijvoorbeeld in een takenlogboek kijken om te zien wanneer de laatste taak is uitgevoerd).

Binnen Java zijn er veel opties:onbewerkte threads, slapen, Timers, ScheduledExecutorService, zoiets als Quartz, EJB Timer Beans (als je een Java EE-container gebruikt).

Maar ik ben een KISS-fan. Als een cronjob het kan, laat het dan en doe het een keer.



  1. Kan het stuurprogramma niet maken vanuit NHibernate.Driver.NpgsqlDriver

  2. SQL Server :SUM() van meerdere rijen inclusief waar-clausules

  3. Fatale fout:niet-gevangen fout:oproep naar niet-gedefinieerde functie mysql_pconnect()

  4. Hoe verwijder ik dubbele rijen en behoud ik de rij met een hogere waarde?