Maison  >  Article  >  développement back-end  >  Implémentation de la bibliothèque standard de la fonction gocron (testable)

Implémentation de la bibliothèque standard de la fonction gocron (testable)

王林
王林avant
2024-02-15 12:51:081042parcourir

Implémentation de la bibliothèque standard de la fonction gocron (testable)

L'éditeur PHP Baicao vous présente une fonction appelée gocron, qui est une implémentation de bibliothèque standard et possède des fonctionnalités testables. La fonction gocron est conçue pour fournir un moyen simple de créer et de gérer des tâches planifiées. Il peut aider les développeurs à écrire et planifier facilement plusieurs tâches planifiées, et fournit également des fonctions de test flexibles pour permettre aux développeurs d'effectuer des tests unitaires et une vérification fonctionnelle. Que ce soit dans un environnement de développement ou un environnement de production, la fonction gocron est un outil puissant et fiable qui peut être utilisé pour mettre en œuvre diverses exigences de tâches de synchronisation complexes.

Contenu de la question

Je dois exécuter une tâche à certains intervalles (atteindre le point de terminaison restant, puis envoyer un message à la file d'attente). Actuellement, j'ai cette fonction qui utilise gocron - https://github.com/go-co-op/gocron

Mais il n'existe actuellement aucun mécanisme pour arrêter cette fonctionnalité, je ne peux donc pas la tester proprement.

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
}

Il fait ce qui est demandé et exécute la fonction paramétrée aux intervalles requis, mais je suis sûr qu'il doit exister une solution plus propre - probablement la bibliothèque standard.

Solution

Vous pouvez simplement renvoyer la fonction .stop :

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
}

Ensuite, dans votre test, vous pouvez faire ce qui suit :

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")
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer