如何为方法执行计数保护创建计时看门狗

问题描述 投票:0回答:1

我想编写一些代码,如果在指定的时间间隔内超过了最大值,则将通知侦听器。

比方说,我想知道某个方法在30秒的滑动时间内调用速度是否太快。

在此方法中,我会通知此watchdog必须增加计数器。

而且我希望能够在配置的时间段内跟踪100个以上的呼叫。

所以看门狗将像这样被实例化:new Watchdog(100, 30, TimeUnit.SECONDS, theListener);

我真的不知道如何开始编码。任何提示将不胜感激。

java watchdog
1个回答
1
投票

如果我很了解,您需要一个或几个WatchDog,它们跟踪timeLapse内是否达到了maximumNumber?

我想这很适合观察者模式,在该模式中,主题(例如程序)向观察者发送通知(例如观察狗观察程序的行为)。>>

这里是监视程序正在监视的程序或主题:

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

© www.soinside.com 2019 - 2024. All rights reserved.