Plánovač a updater
Modul services/scheduler používá Quartz. Stejný image se v nkp-deploy spouští dvakrát s jiným argumentem.
Režimy scheduleru
cz.inovatika.SchedulerMain vyžaduje právě jeden argument:
harvester- zaregistruje denní harvest job; po sklizni spustí úplný updater,updater- spustí interní službu pro cílené přepočty bez časovaného full updater jobu,updater-once- jednou synchronně spustí úplný updater a proces ukončí,all- spustí interní službu a denní harvest job v jednom procesu.
Bez argumentu nebo s jinou hodnotou proces skončí chybou. Compose používá oddělené služby:
harvester:
command: ["harvester"]
updater:
command: ["updater"]
To umožňuje obě služby restartovat a sledovat nezávisle.
Časování
Trigger harvesteru používá startNow() a interval 24 hodin. Praktický důsledek je:
- po startu/restartu kontejneru se úloha spustí ihned,
- harvester poté běží přibližně denně,
- po dokončení každé úspěšné sklizně se ihned spustí úplný updater,
- updater nemá samostatný časovaný trigger.
Interval je v současnosti zapsaný v kódu, není v app.conf.
Harvester job
cz.inovatika.HarvesterJob načte konfiguraci, spustí inkrementální sklizeň všech
instancí a po jejím úspěšném dokončení ihned spustí úplný UpdaterImpl. Chybějící
timestamp způsobí plnou sklizeň dané instance. Dřívější ruční metody
fullHarvest() a incrementalHarvest() nejsou aktivní veřejné CLI.
Updater job
cz.inovatika.UpdaterJob umí načíst konfiguraci a spustit UpdaterImpl, ale není
samostatně registrován do Quartz scheduleru. Úplný běh vyvolává HarvesterJob.
Aktuální updater:
- Projde smlouvy v core
contracts. - Podle ČČNB/ISSN najde odpovídající tituly.
- Licence s prefixem knihovny doplní do
assigned_licenses, pokud daný titul skutečně náleží odpovídající knihovně. - Cursor pagingem projde všechny dokumenty v
titlespo 100 vstupech. - Zvolí kurátorsky opravený nebo sklizený rok vydání.
- Znovu vyhodnotí workflow včetně posledního autora a zvláštních typů autorství.
- Doplní chybějící štítek pro titul bez
root_title. - Aktualizuje
release_year, i když se stav nemění. - Změny zapisuje po dávkách 200 a explicitně commituje
titles.
Změny workflow se zapisují s uživatelem Updater.
Cílený přepočet z webové aplikace
Proces updateru poslouchá na interním portu 8081:
POST /internal/workflow/recalculate
Content-Type: application/json
Authorization: Bearer <workflowUpdate.token>
{
"pids": ["uuid:..."],
"requestedBy": "uzivatel",
"cause": "last_year_death"
}
Požadavky z webové aplikace používají jednovláknovou frontu. Cílený přepočet
načte aktuální dokument a při zápisu používá Solr _version_; konflikt způsobí
nové načtení a nejvýše tři pokusy. Změna stavu potom vyvolá také přepočet
kořenového titulu.
Endpoint vrací HTTP 200 s výsledkem jednotlivých PIDů. Pokud požadavek čeká ve
frontě déle než workflowUpdate.responseTimeoutSeconds, vrátí HTTP 202 a
zpracování pokračuje. Fronta není perzistentní a volání z webové aplikace je
best-effort; úplný běh updateru zůstává záložním mechanismem.
Webová aplikace při těchto změnách zapisuje pouze vstupní údaje, například
last_year_death, date_issued_year_kapp a příznaky autorství. Odvozené pole
release_year počítá a zapisuje výhradně updater. Ruční kurátorská změna stavu
zůstává samostatnou explicitní operací webové aplikace.
Harvester po zapsání a commitnutí všech sklizených titulů spustí úplný updater
přímo. Ten proto provede také kontrolu smluv a přepočítá celý core titles.
Kandidátní filtr
Kód obsahuje builder kandidátního filtru podle roků a příznaků. V aktuálním běhu však není filtr připojen k Solr dotazu; updater záměrně prochází všechny tituly. Při odhadu času a zatížení proto vycházejte z celé velikosti core titles.
Last-author updater
single-use-services/last-author-updater je samostatná jednorázová aplikace, nikoli Quartz job. Páruje hodnoty last_author_excel s core authors, zapisuje upravená autoritní data k titulům a může připravit podklady pro další workflow přepočet.
Spuštění a volby jsou popsané v části Tabulkové importy a poslední autor.
Ruční spuštění
Před prvním lokálním spuštěním sestavte a nainstalujte backendové moduly:
.\mvnw.cmd install -DskipTests
Jednotlivé režimy pak spustíte přes POM příslušného modulu:
.\mvnw.cmd -f services/scheduler/pom.xml exec:java '-Dexec.args=harvester'
.\mvnw.cmd -f services/scheduler/pom.xml exec:java '-Dexec.args=updater'
.\mvnw.cmd -f services/scheduler/pom.xml exec:java '-Dexec.args=updater-once'
.\mvnw.cmd -f single-use-services/last-author-updater/pom.xml exec:java '-Dexec.args=<volby>'
V produkci preferujte příslušnou Compose službu, protože používá správné volume a síťové názvy.