Domanda

Abbiamo un'applicazione client RMI scritto in Java, che ha bisogno di inviare periodici "rimanere in vita" messaggi a un'applicazione server. Abbiamo implementato questo come un filo battito cardiaco separato, che invia il messaggio di soggiorno vivo al server, poi dorme per 15 secondi utilizzando Thread.sleep ().

Il filo è impostato per essere alta priorità:

Thread heartbeatThread = new Thread(new HeartbeatRunnable(server));
heartbeatThread.setPriority(Thread.MAX_PRIORITY);
heartbeatThread.start();

Tuttavia, quando la casella su cui il client è in esecuzione sta usando un sacco di CPU, troviamo che i battiti cardiaci sono mancati, che fa sì che il server per assumere la nostra applicazione client è morto.

Abbiamo aggiunto Thread.yield () chiama nel mio thread principale, anche se questo non ha reso il problema andare via.

C'è un modo di garantire che i battiti cardiaci vengono inviati in tempo mentre la mia applicazione è ancora in esecuzione?

È stato utile?

Soluzione

È possibile implementare in modalità utente threading in un ambiente non-threaded spargendo a piene mani una funzione di "resa" auto-scritte nel codice.

Allo stesso modo, si potrebbe liberamente disperdere chiamate di funzione di controllo del battito cardiaco nel codice. Rinunciare il filo, è sufficiente chiamare regolarmente una funzione battito cardiaco, che controlla se un battito cardiaco ancora deve essere inviato.

E 'una soluzione grezza, ma dato che hai provato la soluzione corretta e non funziona, forse è qualcosa che si deve ricadere.

In realtà quello che si potrebbe fare è mettere una macro all'inizio di ogni chiamata di funzione, che fa un rapido controllo sul tempo e chiama la funzione battito cardiaco in caso di necessità.

(Ah, avete le macro in Java Credo di no? - ma si ottiene l'idea)

.

Altri suggerimenti

Non si può davvero garantirla. Si potrebbe inviare il battito cardiaco in un thread diverso per evitare che il tempo necessario per inviare il battito cardiaco viene aggiunto al tuo ritardo. Può anche essere consigliabile impostare il ritardo tra due battiti cardiaci per la metà del tempo il server utilizza per decidere un cliente è morto, cioè se i tempi di server fuori il vostro cliente dopo 15 secondi, (provare a) inviare un battito cardiaco ogni 7,5 secondi.

Dipende quale processo sta usando la CPU.

Se non è il vostro processo, e così il processo client in realtà non risponde, allora è a tutti gli effetti, non vivo, quindi non l'invio di un heartbeart è appropriato. Avere un messaggio di battito cardiaco che dice 'Sono su e in grado di elaborare i messaggi' quando la casella è troppo caricato per fare questo sarebbe fuorviante.

Se l'intento del messaggio battito cardiaco è dire 'questo processo è in esecuzione, ma potrebbe essere una mezz'ora fino a quando ho tornare a voi', quindi avere tutto quello che sta facendo l'elaborazione inviare quel messaggio al server. O impostare il timeout per uno che si adatta con la capacità di risposta del cliente.

Si dovrebbe configurare il numero di "heartbeat mancanti" che il server attende prima di decidere che il client non è disponibile.

Così, per esempio, se il vostro intervallo di heartbeat di 15 secondi ed il numero di battiti cardiaci perdere è 4, il server attenderà fino a un massimo di 60 secondi (1 minuto) prima di decidere che il cliente non è raggiungibile.

Forse la soluzione migliore sarebbe quella di utilizzare di Timer scheduleAtFixedRate . Con questo, se i ritardi un'esecuzione (che non possono essere evitati in Java), le chiamate successive non saranno influenzati.

Se si desidera che il server di annunciare che è vivo, si può essere meglio presentando un socket aperto. Sul vostro cliente semplicemente leggere da quella presa. Sarà blocco (dal momento che il server non sta scrivendo nulla), e se il server scompare / spegne il vostro cliente otterrà un IOException che indica che il server socket / porto è scomparso.

Questo non sarà dipendente dal server che fornisce i battiti cardiaci tempestive. Esso utilizza poche risorse (una porta TCP sul lato server e vicino a nessun larghezza di banda), ed è puntuale nel rivelare quando il server (o macchina server) non è più disponibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top