Uso esclusivo di un server Jini durante una chiamata di lunga durata

1

Sto provando a usare Jini, in un "Masters / Workers" accordo, ma i lavori di Worker potrebbero essere di lunga durata. Inoltre, ogni lavoratore deve avere accesso esclusivo a una risorsa singleton su quella macchina.

Allo stato attuale, se un lavoratore riceve un'altra richiesta mentre è in esecuzione una richiesta precedente, la nuova richiesta viene accettata ed eseguita in un secondo thread.

Esistono best practice per garantire che un Worker non accetti altri lavori fino a quando il lavoro corrente non è completo?

Cose che ho considerato:

  • sincronizza il lavoro sul server, con un blocco sulla risorsa singleton. Questo funzionerebbe, ma è lontano dall'ideale. Una chiamata da un Master bloccherebbe fino al completamento del thread corrente del lavoratore, anche se altri lavoratori diventeranno liberi nel frattempo
  • annullare la registrazione di Worker dal registro mentre il lavoro è in esecuzione, quindi registrarsi nuovamente al termine. Potrebbe funzionare OK, ma qualcosa non ha un buon odore con questa idea ...

Naturalmente, sono abbastanza felice di sentirmi dire che ci sono tecnologie più appropriate di Jini ... ma non vorrei nulla di troppo pesante, come la distribuzione di contenitori EJB dappertutto.

    
posta Matthew Flint 02.05.2012 - 23:05
fonte

2 risposte

1

Il pattern "Masters / Workers" a cui ti colleghi chiaramente non che stai implementando, perché utilizza JavaSpace come archivio intermedio per richieste e risultati, facendo sparire il tuo problema.

E infatti questa è la soluzione standard per questo tipo di scenario: una coda a cui "Master" aggiunge le richieste e da cui "I lavoratori" accettano le richieste da elaborare.

    
risposta data 02.08.2012 - 10:10
fonte
0

Per rispondere alla mia stessa domanda, e probabilmente guadagnarmi un badge di "rottura dello scambio etichetta galoppante" ...:

Un servizio può escludersi dal registro per impedirne la richiesta di nuovo.

See:

Exporter.unexport(bool)

In questo caso, ho bisogno di passare "true" in modo che l'unexport avvenga immediatamente, altrimenti aspetterà fino al completamento della chiamata corrente, sconfiggendo l'oggetto di questo esercizio. Probabilmente sincronizzerò anche l'accesso all'intero oggetto server, in un mezzo tentativo di impedire una "corsa di due chiamate allo stesso tempo".

    
risposta data 04.05.2012 - 00:45
fonte

Leggi altre domande sui tag