Sto cercando di scrivere un'applicazione Java che funzioni in modo simile a MapReduce. C'è un server e diversi lavoratori. I lavoratori possono entrare e uscire a loro piacimento e l'appartenenza al gruppo ha uno stato "soft". Per diventare parte del gruppo, il lavoratore deve inviare un datagramma UDP al server, ma per continuare a far parte del gruppo, il lavoratore deve inviare il datagramma UDP al server ogni 5 minuti. Al fine di accogliere errori temporanei, a un operatore è permesso di perdere fino a due datagrammi UDP periodici consecutivi. Pertanto, il server deve tenere traccia dell'attuale gruppo di lavoratori e dell'ultima volta in cui ciascun lavoratore ha inviato un datagramma UDP.
Ho implementato una classe chiamata WorkerListener che implementa Runnable e ascolta i datagrammi UDP su una particolare porta UDP. Ora, per tenere traccia dei lavoratori attivi, questa classe può mantenere un HashSet (o HashMap). Quando viene ricevuto un datagramma, il server può interrogare HashSet per verificare se si tratta di un nuovo membro. In tal caso, può aggiungere il nuovo lavoratore al gruppo aggiungendo una voce in HashSet. In caso contrario, è necessario ripristinare un "timer" per il lavoratore, osservando che ha appena sentito dal lavoratore corrispondente. Sto usando la parola timer in senso generico. Non deve essere un orologio di sorta. Forse questo potrebbe anche essere implementato usando int o variabili lunghe.
Inoltre, il server deve eseguire un thread che monitora continuamente i timer per i lavoratori per vedere che un client che va in time out su due intervalli di datagrammi consecutivi, viene rimosso da HashSet. Non voglio farlo nel thread WorkerListener perché si bloccerebbe nella funzione UDP datagramma receive (). Se creo un thread separato per monitorare il worker HashSet, dovrebbe essere una classe diversa, forse WorkerRegistrar. Devo condividere l'hashset con quel thread. Anche l'esclusione reciproca deve essere implementata.
La mia domanda è, qual è il modo migliore per farlo? Puntatori a qualche esempio di implementazione sarebbero grandiosi. Voglio utilizzare l'implementazione JDK di barebones e non alcune API di manutenzione dello stato di fantasia che si occupano di tutto, perché voglio che questa sia una dimostrazione utile per una classe che sto insegnando. Grazie