Heim  >  Artikel  >  Backend-Entwicklung  >  Standardbibliotheksimplementierung der Gocron-Funktion (testbar)

Standardbibliotheksimplementierung der Gocron-Funktion (testbar)

王林
王林nach vorne
2024-02-15 12:51:08997Durchsuche

Standardbibliotheksimplementierung der Gocron-Funktion (testbar)

Der PHP-Editor Baicao stellt Ihnen eine Funktion namens Gocron vor, die eine Standardbibliotheksimplementierung ist und über testbare Funktionen verfügt. Die Gocron-Funktion soll eine einfache Möglichkeit bieten, geplante Aufgaben zu erstellen und zu verwalten. Es kann Entwicklern dabei helfen, mehrere geplante Aufgaben einfach zu schreiben und zu planen, und bietet außerdem flexible Testfunktionen, um Entwicklern die Durchführung von Komponententests und Funktionsüberprüfungen zu erleichtern. Ob in einer Entwicklungsumgebung oder einer Produktionsumgebung, die Gocron-Funktion ist ein leistungsstarkes und zuverlässiges Tool, mit dem verschiedene komplexe Anforderungen an Timing-Aufgaben umgesetzt werden können.

Frageninhalt

Ich muss in bestimmten Abständen einen Job ausführen (den Rest-Endpunkt erreichen und dann eine Nachricht an die Warteschlange senden). Derzeit habe ich diese Funktion, die Gocron verwendet – https://github.com/go-co-op/gocron

Aber es gibt derzeit keinen Mechanismus, um diese Funktion zu stoppen, daher kann ich sie nicht sauber testen.

func RunSchedule(cronExpression string, myFunction func()) error {
    scheduler := gocron.NewScheduler(time.UTC)
    _, err := scheduler.Cron(cronExpression).StartImmediately().Do(myFunction)
    if err != nil {
        return err
    }
    scheduler.StartBlocking()
    return nil
}

Es tut, was verlangt wird, und führt die parametrisierte Funktion in den erforderlichen Intervallen aus, aber ich bin mir sicher, dass es eine sauberere Lösung geben muss – wahrscheinlich die Standardbibliothek.

Problemumgehung

Sie können einfach die .stop-Funktion zurückgeben:

func runschedule(cronexpression string, myfunction func()) (stop func(), err error) {
    scheduler := gocron.newscheduler(time.utc)
    _, err = scheduler.cron(cronexpression).startimmediately().do(myfunction)
    if err != nil {
        return nil, err
    }
    go func() {
        scheduler.startblocking()
    }()

    return scheduler.stop, nil
}

Dann können Sie in Ihrem Test Folgendes tun:

called := 0
stop, err := RunSchedule("some-schedule", func() {
    called++
})
time.Sleep(time.Second * 1) // whatever you need to do 
stop()
if called != 1 {
    t.Fail("called should be 1")
}

Das obige ist der detaillierte Inhalt vonStandardbibliotheksimplementierung der Gocron-Funktion (testbar). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen