периодическое сохранение / сброс / фиксация - есть ли название у этого шаблона?

Я снова и снова сталкиваюсь с подобной проблемой: есть какой-то фрагмент кода, который обрабатывает данные по мере их поступления от пользователя / сети / производит некоторого рода. Из соображений эффективности я не хочу вызывать flush () или commit () для каждой части данных, которые я получаю, но только изредка.

Я обычно вспоминаю с таким кодом:

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();
    }
}

У меня возникает отчетливое ощущение, что я изобретаю велосипед каждый раз, когда пишу это, и более того, Я продолжаю что-то менять каждый раз, когда пишу такой код, в зависимости от того, имеют ли различные части смысл в конкретном контексте.

Мне кажется, что это очень распространенный шаблон, но я не помню, чтобы видел его по имени или реализована в виде библиотечной утилиты. Пока мне приходится реализовывать это самостоятельно, я все время сталкиваюсь с параличом анализа всякий раз, когда я реализую его заново. Пожалуйста, помогите мне!

ОБНОВЛЕНИЕ : После того, как я написал это, я понял, что не учел очистку буфера перед выключением JVM, поэтому я добавил в конструктор обработчик выключения. Теперь я понял, что этот код по-прежнему не будет работать должным образом, если завершение работы произойдет менее чем MIN_SAVE_PERIOD миллисекунд после последнего сохранения, поэтому мне, вероятно, следует провести рефакторинг saveData . Это происходит снова.

5
задан Charles 8 January 2012 в 15:38
поделиться