91 votes

Quel est le moyen le plus simple d'exécuter localement une fois une fonction Azure déclenchée par une minuterie ?

J'ai quelques fonctions Azure en C# qui s'exécutent selon un calendrier en utilisant la méthode suivante déclenchements de la minuterie . Je les ai mis en place comme ça, où %TimerSchedule% fait référence à une expression cron dans les paramètres de l'application :

public static void Run([TimerTrigger("%TimerSchedule%")]TimerInfo myTimer, TraceWriter log)

Pendant le développement, je souhaite souvent exécuter les fonctions localement à l'aide d'Azure Functions Tools for Visual Studio + Azure Functions Core Tools. Mais lorsque j'appuie sur F5 pour déboguer la fonction localement, elle ne s'exécute (généralement) pas immédiatement. Au lieu de cela, elle commence à attendre la prochaine occurrence selon la planification de la minuterie. Ainsi, par exemple, si mon expression cron indique qu'elle doit s'exécuter tous les jours à 20 heures, je dois attendre 20 heures pour que la fonction s'exécute réellement sur ma machine.

Donc ma question est : Quel est le moyen le plus simple et le plus efficace pour qu'une fonction soit exécutée une fois en local ?

Des choses que j'ai essayées ou envisagées :

  1. Utilisez un horaire plus fréquent pour le développement local.
    • C'est correct mais pas parfait - vous devez toujours attendre un peu, sauf si c'est très fréquent, et si c'est très fréquent, la fonction peut s'exécuter plusieurs fois. C'est ce que je fais maintenant.
  2. Écrivez une application console ou un test unitaire qui appelle directement la fonction Run() méthode
    • Ce n'est pas simple à 100% car vous devez fournir TimerInfo et TraceWriter arguments pour Run() - et j'ai trouvé étonnamment peu de documentation à ce sujet.

Microsoft Stratégies pour tester votre code dans Azure Functions n'est pas très utile à ce sujet - elle ne mentionne que les déclencheurs de minuterie comme moyen de tester la qualité de l'eau. autre les types de déclenchement.

Dans un monde parfait, j'appuierais sur F5 et la fonction s'exécuterait immédiatement une fois - comme pour le développement d'une application .NET "normale".

104voto

BerDev Points 399

J'ai eu la même question, et j'ai utilisé le drapeau DEBUG pour que le RunOnStartup ne soit exécuté que pendant le débogage :

        public static void Run(
            [TimerTrigger("* 0 7 * * 1-5"
#if DEBUG
            , RunOnStartup=true
#endif
            )]TimerInfo myTimer, TraceWriter log)
        {

1 votes

C'est horrible, mais c'est ce dont j'ai besoin et ça marche.

1 votes

C'est ce que j'ai fini par faire, et oui c'est moche, mais ça marche pour le débogage local !

0 votes

Je ne comprends pas ce qu'il y a de si laid.

88voto

Wah Yuen Points 935

Vous pourriez peut-être utiliser le RunOnStartup comme documenté ici . Cela ne répond pas tout à fait à votre demande de ne l'exécuter qu'une seule fois, mais il devrait au moins l'exécuter localement une fois l'application lancée.

/// Gets or sets a value indicating whether the function should be invoked
/// immediately on startup. After the initial startup run, the function will
/// be run on schedule thereafter.

Exemple utilisant la liaison d'attributs :

[TimerTrigger("%TimerSchedule%", RunOnStartup = true)]TimerInfo myTimer

0 votes

Ai-je raison de penser que la fonction sera également exécutée une fois dans le nuage chaque fois que je la déploie ? Ce commentaire semble indiquer que oui. Si c'est le cas, c'est un grand pas dans la bonne direction, mais c'est un peu dommage qu'il faille revenir en arrière avant de déployer si je ne veux pas changer le comportement de "production".

3 votes

@ripley_ oui, je crois que vous auriez raison. Une option pourrait être de lier le booléen à une variable dans votre configuration, de la même manière que vous avez lié votre 'TimerSchedule'. À partir de là, vous pouvez définir votre développement local sur true et vos environnements de production (ou autres) sur false, comme vous le souhaitez.

2 votes

Comment lier RunOnStartup à un booléen défini dans ma configuration. La syntaxe "%%" ne fonctionne pas pour les valeurs autres que des chaînes de caractères.

71voto

Nissan Points 591

De https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local?tabs=Windows%2Ccsharp%2Cbash#non-http-triggered-functions

Fonctions déclenchées en dehors du HTTP

Pour tous les types de fonctions autres que les déclencheurs HTTP et les webhooks, vous pouvez tester vos fonctions localement en appelant un point de terminaison d'administration. L'appel de ce point de terminaison avec une requête HTTP POST sur le serveur local déclenche la fonction. Vous pouvez éventuellement transmettre des données de test à l'exécution dans le corps de la requête POST. Cette fonctionnalité est similaire à l'onglet Test du portail Azure.

Vous appelez le point de terminaison administrateur suivant pour déclencher des fonctions non-HTTP :

http://localhost:{port}/admin/functions/{function_name}

Pour transmettre des données de test à l'administrateur d'une fonction, vous devez fournir les données dans le corps d'un message de demande POST. Le corps du message doit avoir le format JSON suivant :

{
    "input": "<trigger_input>"
}

16voto

Renel Chesak Points 101

Si vous utilisez VS Code, utilisez l'option Extension Azure Functions :

  1. Appuyez sur F5 pour entrer en mode débogage, ce qui lance l'application de la fonction.
  2. Allez sur l'icône Azure dans la barre d'activité.
  3. Sous Local Project Trouvez la fonction que vous voulez exécuter, faites un clic droit et sélectionnez "Exécuter la fonction maintenant".

Regardez cette SEP guide de démarrage rapide .

9voto

maxspan Points 310

Utiliser le facteur devrait faire l'affaire. Suivez les étapes ci-dessous pour exécuter ou déboguer votre Timer Trigger localement.

1 . Lancez votre projet.

  1. Ouvrez Postman et collez cette url http://localhost:{port}/admin/functions/{function_name}

  2. Assurez-vous d'utiliser une méthode POST avec un corps Json de { "input" : "" }

  3. Appuyez sur SEND.

Vous devriez recevoir une réponse de 202.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X