Reply Pilot Worker
Tato stranka popisuje Java 21 modul reply-pilot-worker/.
Role modulu
- background job container mimo request cyklus
- owner mailbox import workflow nad
reply-pilot-be - umi periodicky obnovovat Gmail watch a volitelne cist Gmail Pub/Sub Pull subscription nad
reply-pilot-be - umi drzet sjednoceny
gmail_synchronizerjob, ktery spojuje watch pull a mailbox import do jedne pipeline - umi kazdych 120 sekund spoustet uplnou CME company synchronizaci nad
reply-pilot-be - kazde dve hodiny autentizovane triggeruje logical dump v
reply-pilot-db-backup; nezna DB host, user ani password - umi kazdou minutu synchronizovat lokalni
task_jiracache podle Jiry presreply-pilot-be - umi volitelne periodicky spoustet AI klasifikaci prefiltrovanych requirement kandidatu nad
reply-pilot-be - umi volitelne periodicky spoustet finalni requirement agregaci nad
reply-pilot-be - pripravena hranice pro dalsi async joby a retry flow
Runtime
- worker nema verejne HTTP rozhrani na hostu
- worker vystavuje interni HTTP status API na sdilene Docker siti:
GET /healthzpro healthcheck kontejneruGET /statuszpro backend monitoring- lokalni heartbeat zustava v
data/worker-heartbeat.json;GET /healthzjeho cerstvost vyuziva pro self-check workeru - heartbeat ted krom
last_jobdrzi ijob_metricspo jednotlivych workerech a polerunning_jobs, aby slo delat jednoduchy ops report nad AI a evaluation pipeline - loguje vyhradne na
stdout/stderr; lokalne pouzijdocker compose logs - backend vola pres
BACKEND_API_BASE_URL, defaultnehttp://reply-pilot-be:5000 - worker pouziva Spring
ThreadPoolTaskSchedulerv jednom procesu: - sedm samostatnych
@Componentjobu ma@Scheduled(fixedDelay); interval se pocita od dokonceni predchoziho behu, ne od jeho zacatku - Gmail watch a synchronizer maji Spring
Trigger, ktery zachovava dynamicke retry deadlines, exponencialni backoff a intervaly mailbox pollingu - devet jobu ma k dispozici devet execution vlaken a heartbeat dalsi vlakno
- jeden job se v teto instanci nespusti podruhe, dokud jeho predchozi beh stale trva
gmail_synchronizerje jediny owner mailbox flow a drzi si vlastni stav rozbehnuteho importu- produkcne bezi jedna instance scheduleru; nevytvari se distribuovany scheduler
- HTTP volani pouzivaji JDK
HttpClient, status API JDKHttpServer, JSON Jackson - heartbeat se zapisuje atomicky; pri selhani zapisu se jeho timestamp neobnovi
SIGTERMrusi cekajici behy, prerusi aktivni HTTP requesty a ukonci status server- Java healthcheck
java -jar /app/reply-pilot-worker.jar --healthcheckpouze vola lokalni/healthz; nevyzaduje Python ani curl
Kod a overeni
Vsechny tridy jsou v src/main/java/cz/replypilot/worker/:
ReplyPilotWorker.java: Spring context a jednorazove spusteniWorkerScheduling.java:@EnableScheduling, pool a registrace Gmail triggersCmeCompanySyncJob.java: anotovany CME job volajici/api/cme/company-sync/runDatabaseBackupJob,OrganizeMeetingResumeJob,WorkWizardSnoozeCleanupJob,JiraTaskSyncJob,RequirementAiJob,RequirementEvaluationJob: ostatni periodicke@ScheduledjobyGmailWatchJob.java,GmailSynchronizerJob.java: Gmail watch a mailbox pipelineWorkerJob.java: spolecne provedeni jobu a zaznam chyb;GmailJob.java: retry triggerWorkerStatus.java: heartbeat, running jobs a metrikyWorkerStatusServer.java: interni/healthza/statuszBackendClient.java: HTTP/JSON kontrakt, timeouty a redakce credentials v chybachWorkerConfig.java: existujici env defaults a lokalni dotenv precedenceWorkerApplication.java: trvaly proces,--oncea--healthcheck- z korene repozitare:
mvn -f reply-pilot-worker/pom.xml test package
--once neregistruje scheduling ani status server. On-start prepinace a
konfiguracni defaults zustavaji stejne; Gmail synchronizer a oba pevne
maintenance joby startuji okamzite. CME je ve vychozim stavu vypnuty, po
zapnuti ceka prvni interval, pokud neni WORKER_CME_SYNC_ON_START=true.
Aktualni job
gmail_synchronizerv kratkem intervalu volaPOST /api/mailbox/watch/pull; pokud notifikace ukazuji na zmenu mailboxu, zaqueueuje import- jednou za
WORKER_IMPORT_POLL_INTERVAL_SECONDSsigmail_synchronizerkontrolujeGET /api/mailbox/import/status - kdyz import je
QUEUEDneboRUNNING,gmail_synchronizerho po krocich dotahuje presPOST /api/mailbox/import/step - auto-queue importu zustava volitelne pres
WORKER_IMPORT_AUTO_QUEUE_ENABLED=true; kdyz je zapnute,gmail_synchronizerpravidelne frontuje incremental import i bez watch notifikace, ne opakovany full scan - pro aktivni import
gmail_synchronizeropakovane volaPOST /api/mailbox/import/step, dokud backend nevratiCOMPLETEDneboFAILED POST /api/cme/company-sync/runjednou zaWORKER_CME_SYNC_INTERVAL_SECONDS; synchronizuje dodavatele zdodavatelvčetně odpovědného obchodníka zdodavatel_informacea rezervace zosloveni_dodavatele; firmy páruje výhradně podle povinného platného IČO a při více aktivních kandidátech zapíše chybu bez automatického vítězePOST http://reply-pilot-db-backup:8080/api/backupsjednou zaWORKER_DATABASE_BACKUP_INTERVAL_SECONDS(default7200); trigger pouzivaDATABASE_BACKUP_API_TOKEN, bezi i on-start a worker neceka na dokonceni dumpuPOST /api/jira/task-sync/runjednou zaWORKER_JIRA_TASK_SYNC_INTERVAL_SECONDS; backend si pamatuje Jiraupdatedwatermark vpublic.jira_sync_statea lokalnitask_jirabere jako cachePOST /api/tasks/organize-meeting/resume-duepri startu a kazdych 300 sekundPOST /api/work-wizard/snoozes/cleanuppri startu a kazdych 900 sekundPOST /api/requirements/ai-classify/runv konfigurovatelnem intervalu; default je vypnuty, aby se AI job nepoustel bez vedome konfiguracePOST /api/requirements/evaluate/runv konfigurovatelnem intervalu; typicky navazuje na deterministic a AI vrstvu a prepocitava finalni company atributy- Gmail modul pri
POST /api/mailbox/watch/pullulozi pending ack ID a potvrdi je az po uspesnem mailbox-wide snapshot/history zapisu; navazany incremental import pak ridigmail_synchronizer - heartbeat se udrzuje i v idle stavu, aby worker mel lokalni self-observed stav; backend uz ho necte pres sdileny mount, ale pres
GET /statusz - pri timeoutu nebo backend chybe konkretni job nesmi shodit cely worker proces; chyba se materializuje do
job_metricsa scheduler pokracuje dalsimi joby