2011-10-14 108 views
17

Estoy buscando un programador de tareas de código abierto/libre para Windows 7 (máquina de desarrollo) que me permita programar tareas (solicitudes HTTP a un servicio web) para ejecutar cada x segundos .Programador de tareas de Windows para ejecutar tareas en segundos

He intentado un par de Clones de Cron y el propio Programador de tareas de Windows, pero ninguno parece permitir que las tareas se ejecuten en intervalos de menos de 60 segundos. ¿Me estoy perdiendo de algo? No quiero tener que ir y escribir ningún script personalizado si es posible.

+0

¿Ha considerado [Quartz.NET] (http://quartznet.sourceforge.net/)? –

+0

@Nando - trabajamos con Coldfusion, que está basado en Java, por lo que ya había consultado http://www.quartz-scheduler.org. Estoy buscando un programa que no requiera la escritura de código personalizado, solo un escritorio o un programa de línea de comando que me permita hacer solicitudes HTTP en intervalos de 1 a 60 segundos. –

+0

Entonces, supongo que es mejor que preguntes en [Superusuario] (http://superuser.com/) ya que este sitio es principalmente para preguntas de programación. –

Respuesta

3

He buscado en Google esto hasta la muerte, por lo que puedo ver la respuesta es que no hay ninguno. Hay muchas soluciones comerciales, pero no programas de código abierto/gratuitos.

Terminé escribiendo un programador HTTP GET muy simple en Java usando quartz scheduler. Puede ser útil para otros y publicar un enlace a la fuente en guthub https://github.com/bjordan/simple_java_periodic_HTTP_scheduler

+0

+1 para completar esto con su propia respuesta. –

+0

Referencia eliminada ... gracias. –

+0

Descansa en paz mi amigo. – user1940676

30

Es posible crear múltiples activadores para una tarea programada. Si crea 59 activadores idénticos con un desplazamiento de 1 segundo entre sí, y programa la tarea para que se ejecute cada minuto, terminará la tarea programada para ejecutarse cada segundo.

Puede crear esos 59 activadores manualmente usando la GUI. Sin embargo, una forma mucho más rápida de crear tantos disparadores es crear una tarea con uno o dos desencadenantes, exportarla a un archivo de texto, duplicar las líneas correspondientes, cambiar las compensaciones de inicio en consecuencia y luego volver a importar el archivo.

+0

funcionó bastante bien, gracias. – user1940676

+1

Tuve que agregar dos tareas ya que solo podía agregar activadores para los segundos 0 - 47 antes de encontrar un error (supongo que es un error de esquema). – baileyswalk

+0

Consulte [esta publicación del superusuario relacionado] (http://superuser.com/a/668074/108939) - solo necesita configurar múltiples activadores a partir de diferentes segundos desplazamientos. – SliverNinja

6

De hecho, pude lograrlo.

Actualización: Parece que lo he complicado.

En el gatillo, donde dice "Repetir la tarea cada:" en realidad se puede TIPO en el "1 minuto" desplegable (Y no va dejar de escribir el tiempo en segundos)

Lo hice en una máquina con Windows 7.

También, claramente no leí la pregunta lo suficientemente bien, ya que el asker parece haber podido reducir el tiempo a 1 minuto. Sin embargo, dejaré esta respuesta aquí, ya que explicará a los futuros lectores exactamente cómo reducir el tiempo a un minuto.

Parece que no se puede ejecutar en un intervalo de menos de un minuto.


Configuré una tarea con un disparador establecido en Diariamente para que se repitiera cada 1 día. Yo marque la casilla "Repetir tarea cada:". Ajustándolo a 5 minutos para una duración de 1 día

Esto hace que la tarea vaya para siempre, cada 5 minutos.

Luego exporté la tarea. Exporta a un archivo .xml.

Bajo Task > Triggers > CalendarTrigger > Repeition existe la siguiente etiqueta: <Interval>PT5M</Interval> Lo cambié de PT5M a PT1M. Reimporté la tarea.

La tarea ahora se ejecuta cada 1 minuto.

No he probado completamente esto, y no lo he intentado con menos de un minuto, pero podría ser posible al poner PT30S o algo por 30 segundos. Lo probaré e informaré. Actualización: No puede hacer esto, se produce un error al importar la tarea. No es posible establecer este tiempo en menos de 1 minuto.

Todo el gatillo se parece a esto para mí:

<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 explicación: programa principal inicia un proceso de servicio que va a permanecer activo en la memoria y se activará periódicamente un trabajo - hacer algo.

Job scheduler

  1. Crear una clase que amplíe la clase System.ServiceProcess.ServiceBase
  2. implementar al menos OnStart métodos y OnStop
  3. iniciar y utilizar Quartz.NET planificador en OnStart para ejecutar tareas periódicamente

Aquí está mi plantilla C# solución para un servicio de Windows y un demonio Linux en .NET/Mono https://github.com/mchudinov/ServiceDemon Y 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

Tenga en cuenta que [respuestas solo de enlace] (http://meta.stackoverflow.com/tags/link-only-answers/info) están desaconsejadas Las respuestas SO deberían ser el punto final de una búsqueda de una solución (frente a otra escala de referencias, que tienden a quedarse obsoletas a lo largo del tiempo). Considere agregar una sinopsis independiente aquí, manteniendo el enlace como referencia. – kleopatra

Cuestiones relacionadas