Mi trovo ancora e ancora di fronte a un problema simile: c'è una parte di codice che elabora i dati non appena arriva dall'utente/rete/produce di qualche tipo. Per motivi di efficienza, non voglio chiamare flush()
o commit()
su ogni dato che ricevo, ma solo occasionalmente.periodic save/flush/commit - c'è un nome per questo pattern?
Io di solito venire con codice come questo:
class Processor {
private final static MAX_SAVE_PERIOD = 60000;
private final static MIN_SAVE_PERIOD = 20000;
private final static int MAX_BUFFER = 10000;
Arraylist<Data> dataBuffer = new Arraylist<Data>();
private long lastSave = 0;
public Saver() {
new Timer().schedule(new TimerTask() {
periodicSave();
}, MAX_SAVE_PERIOD, MAX_SAVE_PERIOD);
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
periodicSave();
}
}));
}
public synchronized void processData(Data data) {
dataBuffer.add(data);
if(dataBuffer.size() >= MAX_BUFFER) {
saveData();
}
}
private synchronzied void periodicSave() {
if(!dataBuffer.isEmpty()) {
saveData();
}
}
private void saveData() {
if (System.currentTimeMillis() - lastSave < MIN_SAVE_PERIOD) return;
...
lastSave = System.currentTimeMillis();
}
}
ho la netta sensazione che sto reinventare la ruota ogni volta che scrivo questo, e per di più, ho continuare a cambiare cose ogni volta che scrivo questo tipo di codice, a seconda che le varie parti abbiano un senso nel contesto specifico.
Mi sembra che questo sia uno schema molto comune, ma non ricordo di averlo visto o implementato come utilità di libreria. Finché devo implementarlo da solo, continuo ad affrontare la paralisi dell'analisi ogni volta che lo reimplemento. Mi aiuti per favore!
UPDATE: Dopo averlo scritto, mi sono reso conto che non ho considerato il flush del buffer prima dell'arresto di JVM, quindi ho aggiunto un hook di arresto nel costruttore. Ora ho capito che questo codice non funziona ancora correttamente se lo spegnimento avviene a meno di MIN_SAVE_PERIOD
millisecondi dopo l'ultimo salvataggio, quindi dovrei probabilmente refactoring saveData
. Sta succedendo di nuovo.
Cercare "buffering pattern" e "buffering idiom" non produce alcun risultato interessante. È perché è un modello poco interessante? – itsadok
Wikipedia sembra avere una buona definizione generale: http://en.wikipedia.org/wiki/Data_buffer –