2011-10-14 8 views
17

Sto cercando un programma di pianificazione di attività open source/gratuito per Windows 7 (macchina di sviluppo) che consentirà di pianificare attività (richieste HTTP a un servizio Web) per eseguire ogni x secondi .Utilità di pianificazione di Windows per eseguire attività in pochi secondi

Ho provato un paio di cloni Cron e Windows in proprio, ma nessuno dei due sembra consentire l'esecuzione delle attività a intervalli inferiori a 60 secondi. Mi sto perdendo qualcosa? Non voglio dover andare a scrivere script personalizzati se possibile.

+0

Avete considerato [Quartz.NET] (http://quartznet.sourceforge.net/)? –

+0

@Nando - lavoriamo con Coldfusion, che è basato su Java, quindi avevo già controllato http://www.quartz-scheduler.org. Sto cercando un programma che non richieda la scrittura di un codice personalizzato, solo un desktop o un programma a riga di comando che mi consenta di effettuare richieste HTTP tra 1 e 60 secondi. –

+0

Quindi immagino che potresti avere più fortuna a chiedere a [Super User] (http://superuser.com/) in quanto questo sito è principalmente per domande di programmazione. –

risposta

3

Ho cercato su Google fino a questo punto, quindi per quanto posso vedere la risposta è, non ce ne sono. Ci sono molte soluzioni commerciali, ma nessun programma open source/libero.

Ho finito per scrivere un semplice schedulatore HTTP GET periodico in java usando quartz scheduler. Potrebbe essere utile ad altri così pubblicando un link alla fonte su guthub https://github.com/bjordan/simple_java_periodic_HTTP_scheduler

+0

+1 per aver completato questo con la tua risposta. –

+0

Rimosso riferimento .. grazie. –

+0

Riposa in pace amico mio. – user1940676

30

È possibile creare più trigger per un'attività pianificata. Se si creano 59 trigger identici con un offset di 1 secondo l'un l'altro e si pianifica l'attività stessa da eseguire ogni minuto, si termina l'attività pianificata per essere eseguita ogni secondo.

È possibile creare manualmente i 59 trigger utilizzando la GUI. Tuttavia, un modo molto più rapido per creare così tanti trigger è creare un'attività con uno o due trigger, esportarla in un file di testo, duplicare le righe corrispondenti, modificare di conseguenza gli offset iniziali e quindi reimportare il file.

+0

ha funzionato abbastanza bene, grazie. – user1940676

+1

Ho dovuto aggiungere due attività in quanto potevo aggiungere solo trigger per i secondi da 0 a 47 prima di riscontrare un errore (errore di schema presumo). – baileyswalk

+0

Controlla [questo post di superutente correlato] (http://superuser.com/a/668074/108939) - devi solo impostare più trigger a partire da diversi secondi offset. – SliverNinja

6

Sono stato effettivamente in grado di raggiungere questo obiettivo.

Aggiornamento: Sembra che l'abbia complicato troppo.

nel trigger, in cui si dice "Ripeti attività ogni:" si può effettivamente TIPO nella discesa "1 minuto" (E 'abitudine permetterà di digitare il tempo in secondi)

L'ho fatto su una macchina Windows 7.

Inoltre, chiaramente non ho letto abbastanza bene la domanda, poiché il richiedente sembra essere già riuscito a ridurre il tempo a 1 minuto. Tuttavia, lascerò qui questa risposta, poiché spiegherà per i futuri lettori esattamente come ridurre il tempo a un minuto.

Sembra che non sia possibile eseguirlo a intervalli inferiori a un minuto.


Ho impostato un'attività con un trigger impostato su Giornaliera per ricorrere ogni 1 giorno. Controllo la casella "Ripeti task ogni:". Impostazione su 5 minuti per una durata di 1 giorno

Questo rende il compito andare per sempre, ogni 5 minuti.

Ho quindi esportato l'attività. Esporta in un file .xml.

Sotto Task > Triggers > CalendarTrigger > Repeition è presente il seguente tag: <Interval>PT5M</Interval> L'ho modificato da PT5M a PT1M. Ho re-importato l'attività.

L'attività ora viene eseguita ogni 1 minuto.

Non ho provato completamente questo, e non ho provato con meno di un minuto, ma potrebbe essere possibile mettendo PT30S o qualcosa per 30 secondi. Proverò e riferirò. Aggiornamento : non è possibile farlo, si verifica un errore durante l'importazione dell'attività. Non è possibile impostare questa volta a meno di 1 minuto.

L'intera grilletto assomiglia questo per me:

<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> 
0

Breve spiegazione: programma principale avvia un processo di servizio che rimarrà attivo in memoria e volontà periodicamente attivare un lavoro - fare qualcosa.

Job scheduler

  1. Creare una classe che estende la classe System.ServiceProcess.ServiceBase
  2. Implementare a metodi meno OnStart e OnStop
  3. avviare e utilizzare Quartz.NET scheduler in OnStart per eseguire compiti periodicamente

Ecco la mia soluzione modello C# per un servizio Windows e un demone Linux in .NET/Mono https://github.com/mchudinov/ServiceDemon E a short blogpost about it

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

+0

Nota che [risposte solo per collegamento] (http://meta.stackoverflow.com/tags/link-only-answers/info) sono scoraggiate Le risposte SO dovrebbero essere il punto finale di una ricerca di una soluzione (rispetto a un'altra sosta di riferimenti, che tende a diventare obsoleta nel tempo). Si prega di considerare l'aggiunta di una sinossi autonoma qui, mantenendo il collegamento come riferimento. – kleopatra