Je recherche un planificateur de tâches open source/gratuit pour Windows 7 (ordinateur de développement) qui me permette de planifier des tâches (demandes HTTP à un service Web) de s'exécuter toutes les x secondes.
J'ai essayé quelques clones Cron et le planificateur de tâches de Windows, mais aucun ne semble autoriser l'exécution de tâches à des intervalles inférieurs à 60 secondes. Est-ce que je manque quelque chose? Si possible, je ne veux pas non plus aller écrire des scripts personnalisés.
Il est possible de créer plusieurs déclencheurs pour une tâche planifiée. Si vous créez 59 déclencheurs identiques avec un décalage de 1 seconde les uns des autres et planifiez l'exécution de la tâche elle-même toutes les minutes, vous terminez l'exécution de la tâche planifiée toutes les secondes.
Vous pouvez créer ces 59 déclencheurs manuellement à l'aide de l'interface graphique. Cependant, un moyen beaucoup plus rapide de créer autant de déclencheurs consiste à créer une tâche avec un ou deux déclencheurs, à l'exporter dans un fichier texte, à dupliquer les lignes correspondantes, à modifier les décalages de départ en conséquence, puis à réimporter le fichier.
J'ai été en mesure de réaliser cela.
Mise à jour: Il semble que j'ai trop compliqué.
Dans le déclencheur, où il est écrit "Répéter la tâche tous les:" vous pouvez réellementTAPERdans le menu déroulant "1 minute" (il ne vous laissera pas taper le temps en secondes )
Je l'ai fait sur un ordinateur Windows 7.
De plus, je n'ai clairement pas assez lu la question, car le demandeur semble avoir déjà réussi à réduire le temps à 1 minute. Cependant, je laisserai cette réponse ici, car elle expliquera aux futurs lecteurs comment réduire le temps à une minute.
Il semble que vous ne pouvez pas le faire fonctionner à un intervalle de moins d'une minute.
J'ai configuré une tâche avec un déclencheur défini sur Tous les jours pour qu'il se reproduise. Je coche la case "Répéter la tâche tous les:". Réglage sur 5 minutes pour une durée de 1 jour
Cela rend la tâche éternelle, toutes les 5 minutes.
J'ai ensuite exporté la tâche. Il exporte dans un fichier .xml.
Sous Task > Triggers > CalendarTrigger > Repeition
il y a la balise suivante: <Interval>PT5M</Interval>
Je l'ai changé de PT5M
à PT1M
. J'ai réimporté la tâche.
La tâche s'exécute maintenant toutes les 1 minute.
Je n'ai pas complètement testé cela, et je n'ai pas essayé avec moins d'une minute, mais cela pourrait être possible en mettant PT30S
ou quelque chose pendant 30 secondes. Je vais l'essayer et faire rapport. Mise à jour: Vous ne pouvez pas faire cela, vous obtenez une erreur lors de l'importation de la tâche. Il n'est pas possible de régler cette heure à moins de 1 minute.
La gâchette entière ressemble à ceci pour moi:
<Triggers>
<CalendarTrigger>
<Repetition>
<Interval>PT1M</Interval>
<Duration>P1D</Duration>
<StopAtDurationEnd>false</StopAtDurationEnd>
</Repetition>
<StartBoundary>2013-11-07T17:04:51.6062297</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
</Triggers>
J'ai googlé ceci à mort, donc autant que je sache, la réponse est qu'il n'y en a pas. Il existe de nombreuses solutions commerciales, mais pas de programmes open source/gratuits.
J'ai fini par écrire un ordonnanceur HTTP GET périodique très simple en Java en utilisant quartz scheduler . Il peut être utile à d’autres de poster un lien vers la source sur guthub https://github.com/bjordan/simple_Java_periodic_HTTP_scheduler
Explication brève: le programme principal lance un processus de service qui restera actif en mémoire et activera périodiquement un travail - faire quelque chose.
Voici mon modèle de solution C # pour un service Windows et un démon Linux dans .NET/Mono https://github.com/mchudinov/ServiceDemon Et un court article de blog à ce sujet
class Program
{
public static void Main(string[] args)
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new ServiceDemon.Service() };
ServiceBase.Run(ServicesToRun);
}
}
public class Service : ServiceBase
{
static IScheduler Scheduler { get; set; }
protected override void OnStart(string[] args)
{
StartScheduler();
StartMyJob();
}
protected override void OnStop()
{
Scheduler.Shutdown();
}
void StartScheduler()
{
ISchedulerFactory schedFact = new StdSchedulerFactory();
Scheduler = schedFact.GetScheduler();
Scheduler.Start();
}
void StartMyJob()
{
var seconds = Int16.Parse(ConfigurationManager.AppSettings["MyJobSeconds"]);
IJobDetail job = JobBuilder.Create<Jobs.MyJob>()
.WithIdentity("MyJob", "group1")
.UsingJobData("Param1", "Hello MyJob!")
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("MyJobTrigger", "group1")
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).RepeatForever())
.Build();
Scheduler.ScheduleJob(job, trigger);
}
}
public class MyJob : IJob
{
public void Execute(IJobExecutionContext context)
{
JobDataMap dataMap = context.JobDetail.JobDataMap;
log.Info(dataMap["Param1"]);
}
}
</ code>