Ho a che fare con un problema di progettazione. In realtà ho la seguente architettura:
Un'interfaccia Process
:
public interface Processor {
void applyNewConfiguration(final Configuration conf);
Result process();
}
Un processore MyProcessor
che implementa questa interfaccia:
public class MyProcessor implements Processor {
@Override
public void applyNewConfiguration(Configuration conf) {
// Manage configuration which can take a long time
// Scan dir, fetch BIG files, etc.
}
@Override
public Result process() {
// Process regarding the configuration
}
}
E un Manager
che attiva il metodo process
di ogni Processor
quando necessario:
public class ProcessManager {
public void execute() {
// Eventually apply new configuration to a processor
// Call process method of Processor
}
}
Spiego questo: in realtà, all'avvio dell'applicazione, tutti i processori vengono caricati e viene applicata una configurazione.
Il caricamento della configurazione può essere molto lungo e non cambia molto spesso, quindi non ho voluto ricreare un Processor
ogni volta che voglio farlo elaborare.
Quindi sono giustificato a creare una singola istanza di ciascun processore e, quando necessario, applico una nuova configurazione e poi richiamo il metodo di processo come al solito.
Per me, è un brutto progetto perché sto cambiando il comportamento dei miei processori mentre dovrebbero essere Stateless, ma non so come affrontarlo? Se ho chiamato il metodo di processo mentre viene applicata la configurazione, il comportamento sarà drammatico ...
Ovviamente potrei avere un costruttore in ogni processore con la configurazione come parametro, e ricreare un processore ogni volta, ma la gestione della configurazione è un processo molto lungo quindi non voglio farlo.
Stavo pensando di avere una classe separata (forse ConfigurationManagement
) che può gestire ogni oggetto Configuration
, elaborarlo e associarlo a un Pojo (ad esempio in una Map<Configuration,Pojo>
) ma appena una nuova configurazione sarà applicato, quello precedente non sarà garbage collection.
Hai idea di come risolvere questo problema? Sembra abbastanza semplice ma non riesco a trovare alcuna soluzione valida.