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".

6voto

StefanHa Points 328

J'ai eu la même question. Je l'ai résolu avec un Unittest. En effet, vous avez besoin de stub out le TraceWriter et le TimerInfo.

Voici un peu de code comment j'ai fait cela.

TimerInfo :

public class ScheduleStub : TimerInfo
{
    public ScheduleStub(TimerSchedule schedule, ScheduleStatus status, bool isPastDue = false) : base(schedule, status, isPastDue)
    {
    }
}

Et le TraceWriter :

 public class TraceWriterStub : TraceWriter
{
    protected TraceLevel _level;
    protected List<TraceEvent> _traces;

    public TraceWriterStub(TraceLevel level) : base(level)
    {
        _level = level;
        _traces = new List<TraceEvent>();
    }

    public override void Trace(TraceEvent traceEvent)
    {
        _traces.Add(traceEvent);
    }

    public List<TraceEvent> Traces => _traces;
}

1voto

Mike Cardona Points 1

Il suffit d'ajouter une autre fonction avec le type de déclencheur HTTP dans la même classe, d'ajouter votre code, ou d'appeler votre méthode Run à partir de cette fonction et de l'invoquer depuis votre navigateur.

Veillez à commenter/supprimer cette fonction lors du déploiement vers prod, ou vous aurez la possibilité de déclencher la fonction via des appels HTTP dans prod.

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