Как создать сторожевой таймер для защиты счетчика выполнения метода - PullRequest
0 голосов
/ 17 апреля 2020

Я хочу закодировать что-то, что уведомит слушателя, если число вызовов метода превысит максимальное значение с указанным временем.

Допустим, я хотел бы знать, вызывается ли метод немного слишком быстро за период скольжения 30 секунд.

В этом методе я бы уведомил сторожевой таймер , что он должен увеличить счетчик.

И я хочу быть в состоянии отследить более 100 вызовов за настроенные промежутки времени.

Таким образом, сторожевой таймер будет создан следующим образом: new Watchdog(100, 30, TimeUnit.SECONDS, theListener);

Я действительно не знаю, как начать кодирование, если такого рода вещи. Любые советы будут оценены.

1 Ответ

1 голос
/ 17 апреля 2020

Если я хорошо понял, вам нужен один или несколько WatchDogs, которые отслеживают, был ли достигнут максимальный номер за промежуток времени?

Я думаю, это хорошо подходит для паттерна Observer, в котором субъект (например, программа) ) отправляет уведомления наблюдателям (например, WatchDog, наблюдающий за тем, как ведет себя программа).

Здесь будет программа или объект, наблюдаемый Watchdogs:

public class Subject {
    private List<WatchDog> watchDogs = new ArrayList<>();

    public void add(WatchDog watchDog) {
        watchDogs.add(watchDog);
    }

    public void execute() {
        for (WatchDog watchDog : watchDogs) {
            watchDog.update();
        }
    }
}

Здесь будет определение WatchDog:

// Verifies that maxCalls is not reached between lastTimeUpdateWasCalled and
// lastTimeUpdateWasCalled + periodInSeconds
public class WatchDog {
    private Date lastTimeUpdateWasCalled = null;
    private int currentNumberOfCalls = 0;

    private int maxCalls;
    private int periodInSeconds;

    public WatchDog(int maxCalls, int periodInSeconds) {
        this.maxCalls = maxCalls;
        this.periodInSeconds = periodInSeconds;
    }

    public void update() {
        this.currentNumberOfCalls = this.currentNumberOfCalls + 1;
        Date now = new Date();

        if (lastTimeUpdateWasCalled == null) {
            this.lastTimeUpdateWasCalled = now;
            this.currentNumberOfCalls = 1;
            return;
        }

        long endOfPeriodMillis = lastTimeUpdateWasCalled.getTime() + this.periodInSeconds * 1000L;
        Date endOfPeriod = new Date(endOfPeriodMillis);

        if (now.before(endOfPeriod)) {
            this.currentNumberOfCalls = this.currentNumberOfCalls + 1;
            if (this.currentNumberOfCalls >= this.maxCalls) {
                System.out.println("Watchdog has detected that " + this.currentNumberOfCalls + " have been done within "
                        + this.periodInSeconds + " seconds");
            }
        } else {
            // reinitialization
            this.currentNumberOfCalls = 1;
            this.lastTimeUpdateWasCalled = now;
        }

    }
}

Вот как можно собрать все вместе:

public class Main {

    public static void main(String[] args) throws Exception {
        Subject s1 = new Subject();
        WatchDog w = new WatchDog(2, 2);
        s1.add(w);
        s1.execute();

        //Thread.sleep(2000);
        s1.execute();
    }
}

Более подробная информация о схеме наблюдателей здесь: https://sourcemaking.com/design_patterns/observer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...