Attualmente sto sviluppando un'applicazione in cui devo gestire lo stato di diversi servizi e fermarli/avviarli in base ad alcuni eventi. Il problema è che, come dichiarato nei documenti, il servizio di Guava è unidirezionale, il che significa che, una volta arrestato, non può essere riavviato.Servizio riavviabile utilizzando Guava
Dal momento che ho bisogno di aggirare questo problema in qualche modo, mi trovo di fronte a un paio di alternative, che vorrei mettere in discussione (soprattutto perché potrebbero esserci degli svantaggi per cui non sono a conoscenza del giusto adesso).
La prima soluzione ovvia a questo problema consiste nell'istanziare un nuovo servizio quando è necessario "riavviarlo". Funziona, ma nella mia attuale architettura complicherebbe un po 'le cose: attualmente sto installando tutti i servizi, e basandomi sugli eventi di un EventBus, iniziando o fermandoli se necessario. La classe che chiama i metodi start e stop salva solo un riferimento a una mappa di servizi e chiama il metodo giusto su tali istanze in base all'evento ricevuto. Se ho bisogno di istanziare un nuovo oggetto in risposta ad un evento, dovrò rinunciare ad alcuni dei disaccoppiamenti che ho attualmente (possibilmente mantenendo la classe di ogni tipo di servizio e invocando il costruttore usando la riflessione).
Un'altra possibilità è implementare l'interfaccia di servizio come servizio RestartableThreaded (o qualcosa del genere). Se ho seguito questa strada, il mio metodo start() potrebbe creare un altro Thread come se fosse la prima volta e ripristinare gli stati.
C'è qualche chiaro svantaggio per il secondo approccio? Temo che potrebbe mancare qualche ovvio inconveniente qui (oltre a dover codificare qualcosa di un po 'più complicato), specialmente per quanto riguarda la gestione dei thread.
Grazie per la risposta, questa sembra la strada da percorrere. Se prendo il percorso di DI, darò un'occhiata migliore agli ambiti di Guice come suggerito da Craig, ma i fornitori sembrano promettenti. Sfortunatamente riprenderò le mie mani su questo compito tra un paio di giorni, aggiornerò la mia domanda con ulteriori dettagli/opzioni. – pcalcao
Ho avuto un caso d'uso simile e ho adottato un approccio ibrido. Ho usato una cache a elemento singolo piuttosto che un fornitore, in quanto mi ha permesso di cancellare/invalidare la voce quando è stata interrotta. Ma ho messo la mia cache in una classe che implementava il servizio (e per lo più solo delegato al servizio memorizzato nella cache) solo così potevo avere l'API. – Ray