Есть ли способ заставить Apache Commons FileAltivationMonitor предупреждать только один раз о пакете входящих файлов? - PullRequest
0 голосов
/ 28 марта 2019

Я отслеживаю несколько (около 15) путей для входящих файлов, используя Apache Commons FileAlterationMonitor. Эти входящие файлы могут поступать партиями от 1 до 500 файлов одновременно. У меня все настроено, и приложение отслеживает папки, как и ожидалось, у меня настроено опрашивать папки каждую минуту. Моя проблема в том, что, как и ожидалось, слушатель, которого я настроил оповещения для каждого входящего файла, когда все, что мне действительно нужно и нужно, это знать, когда приходит новый пакет файлов. Поэтому я хотел бы получить одно предупреждение в отличие от до 500 одновременно.

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

public class FileMonitor{

    private final String newDirectory;
    private FileAlterationMonitor monitor;
    private final Alerts gui;
    private final String provider;

    public FileMonitor (String d, Alerts g, String pro) throws Exception{
        newDirectory = d;
        gui = g;
        provider = pro;
    }


    public void startMonitor() throws Exception{

        // Directory to monitor
        final File directory = new File(newDirectory);

        // create new observer
        FileAlterationObserver fao = new FileAlterationObserver(directory);
        // add listener to observer
        fao.addListener(new FileAlterationListenerImpl(gui, provider));

        // wait 1 minute between folder polls. 
        monitor = new FileAlterationMonitor(60000);
        monitor.addObserver(fao);
        monitor.start();
    }
}

public class FileAlterationListenerImpl implements FileAlterationListener{

    private final Alerts gui;
    private final String provider;
    private final LogFiles monitorLogs;

    public FileAlterationListenerImpl(Alerts g, String pro){
        gui = g;
        provider = pro;
        monitorLogs = new LogFiles();
    }

    @Override
    public void onStart(final FileAlterationObserver observer){
        System.out.println("The FileListener has started on: " + observer.getDirectory().getAbsolutePath());
    }

    @Override
    public void onDirectoryCreate(File file) {
    }

    @Override
    public void onDirectoryChange(File file) {
    }

    @Override
    public void onDirectoryDelete(File file) {
    }

    @Override
    public void onFileCreate(File file) {
        try{
            switch (provider){
                case "Spectrum": gui.alertsAreaAppend("New/Updated schedules available for Spectrum zones!\r\n");
                             monitorLogs.appendNewLogging("New/Updated schedules available for Spectrum zones!\r\n");
                             break;
                case "DirecTV ZTA": gui.alertsAreaAppend("New/Updated schedules available for DirecTV ZTA zones!\r\n");
                                monitorLogs.appendNewLogging("New/Updated schedules available for DirecTV ZTA zones!\r\n");
                                break;
                case "DirecTV RSN": gui.alertsAreaAppend("New/Updated schedules available for DirecTV RSN zones!\r\n");
                                monitorLogs.appendNewLogging("New/Updated schedules available for DirecTV RSN zones!\r\n");
                                break; 
                case "Suddenlink": gui.alertsAreaAppend("New/Updated schedules available for Suddenlink zones!\r\n");
                               monitorLogs.appendNewLogging("New/Updated schedules available for Suddenlink zones!\r\n");
                                break;
            }
        }catch (IOException e){}
    }

    @Override
    public void onFileChange(File file) {
    }

Выше приведен класс FileMonitor и переопределенный FileAlterationListener, который у меня есть до сих пор.

Любые предложения будут с благодарностью.

1 Ответ

0 голосов
/ 28 марта 2019

Вот быстрая и грубая реализация:

public class FileAlterationListenerAlterThrottler {
    private static final int DEFAULT_THRESHOLD_MS = 5000;

    private final int thresholdMs;
    private final Map<String, Long> providerLastFileProcessedAt = new HashMap<>();

    public FileAlterationListenerAlterThrottler() {
        this(DEFAULT_THRESHOLD_MS);
    }

    public FileAlterationListenerAlterThrottler(int thresholdMs) {
        this.thresholdMs = thresholdMs;
    }

    public synchronized boolean shouldAlertFor(String provider) {
        long now = System.currentTimeMillis();

        long last = providerLastFileProcessedAt.computeIfAbsent(provider, x -> 0l);

        if (now - last < thresholdMs) {
            return false;
        }

        providerLastFileProcessedAt.put(provider, now);

        return true;
    }

}

И более быстрый и грубый водитель:

public class Test {
    public static void main(String[] args) throws Exception {
        int myThreshold = 1000;

        FileAlterationListenerAlterThrottler throttler = new FileAlterationListenerAlterThrottler(myThreshold);

        for (int i = 0; i < 3; i++) {
            doIt(throttler);
        }

        Thread.sleep(1500);

        doIt(throttler);
    }

    private static void doIt(FileAlterationListenerAlterThrottler throttler) {
        boolean shouldAlert = throttler.shouldAlertFor("Some Provider");

        System.out.println("Time now: " + System.currentTimeMillis());
        System.out.println("Should alert? " + shouldAlert);

        System.out.println();
    }
}

Урожайность:

Time now: 1553739126557
Should alert? true

Time now: 1553739126557
Should alert? false

Time now: 1553739126557
Should alert? false

Time now: 1553739128058
Should alert? true
...