La mejor manera de ejecutar tareas programadas [cerrado]


Hoy hemos creado una aplicación de consola para ejecutar las tareas programadas para nuestro ASP.NET sitio web. Pero creo que este enfoque es un poco propenso a errores y difícil de mantener. Cómo ejecutar la tarea programada (en un entorno windows/IIS/ASP.NET)

Actualización:

Ejemplos de tareas:

  • Envío de correo electrónico desde una cola de correo electrónico en la base de datos
  • Eliminar objetos obsoletos de la base de datos
  • Recuperar estadísticas de Google AdWords y llenar una tabla en base.
Author: ankita alung, 2009-02-12

16 answers

Todas mis tareas (que deben programarse) para un sitio web se mantienen dentro del sitio web y se llaman desde una página especial. Luego escribí un simple servicio de Windows que llama a esta página de vez en cuando. Una vez que la página se ejecuta, devuelve un valor. Si sé que hay más trabajo por hacer, corro la página de nuevo, de inmediato, de lo contrario la corro en un poco de tiempo. Esto ha funcionado muy bien para mí y mantiene toda mi lógica de tareas con el código web. Antes de escribir el simple servicio de Windows, utilicé Windows programador para llamar a la página cada x minutos.

Otra forma conveniente de ejecutar esto es usar un servicio de monitoreo como Pingdom. Apunte su comprobación http a la página que ejecuta su código de servicio. Haga que la página devuelva los resultados que luego se pueden usar para activar Pingdom para enviar mensajes de alerta cuando algo no está bien.

 68
Author: Brettski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-20 23:09:10

Esta técnica de Jeff Atwood para Stackoverflow es el método más simple que he encontrado. Se basa en el mecanismo de devolución de llamada" elemento de caché eliminado "construido en ASP.NET' s cache system

Actualización: Stackoverflow ha superado este método. Solo funciona mientras el sitio web está funcionando, pero es una técnica muy simple que es útil para muchas personas.

También echa un vistazo a Quartz.NET

 121
Author: BC.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-20 16:32:27

Crea un servicio personalizado de Windows.

Tuve algunas tareas de misión crítica configuradas como aplicaciones de consola programadas y las encontré difíciles de mantener. Creé un servicio de Windows con un 'latido' que verificaría un horario en mi base de datos cada par de minutos. Ha funcionado muy bien.

Dicho esto, todavía uso aplicaciones de consola programadas para la mayoría de mis tareas de mantenimiento no críticas. Si no está roto, no lo arregles.

 30
Author: Chris Van Opstal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-28 23:12:03

He encontrado que esto es fácil para todos los involucrados:

  • Crear un método webservice como DoSuchAndSuchProcess
  • Cree una aplicación de consola que llame a este webmethod.
  • Programe la aplicación de consola en el programador de tareas.

Usando esta metodología, toda la lógica de negocio está contenida en su aplicación web, pero tiene la confiabilidad del administrador de tareas de Windows o cualquier otro administrador de tareas comercial para iniciarlo y registrar cualquier información de retorno, como informe de ejecución. Usar un servicio web en lugar de publicar en una página tiene una pequeña ventaja porque es más fácil obtener datos de retorno de un servicio web.

 17
Author: Daniel Auger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-14 21:57:42

Por qué reinventar la rueda, usar la clase Threading y Timer.

    protected void Application_Start()
    {
        Thread thread = new Thread(new ThreadStart(ThreadFunc));
        thread.IsBackground = true;
        thread.Name = "ThreadFunc";
        thread.Start();
    }

    protected void ThreadFunc()
    {
        System.Timers.Timer t = new System.Timers.Timer();
        t.Elapsed += new System.Timers.ElapsedEventHandler(TimerWorker);
        t.Interval = 10000;
        t.Enabled = true;
        t.AutoReset = true;
        t.Start();
    }

    protected void TimerWorker(object sender, System.Timers.ElapsedEventArgs e)
    {
        //work args
    }
 10
Author: Moises Goncalves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-04 13:42:31

Utilice el Programador de Windows para ejecutar una página web.

Para evitar que el usuario malicioso o las arañas del motor de búsqueda lo ejecuten, cuando configure la tarea programada, simplemente llame a la página web con una querystring, es decir : mypage.aspx?from = scheduledtask

Luego, en la carga de la página, simplemente use una condición : si (Solicitud.Querystring ["from"] = = " tarea programada") { // executetask }

De esta manera ningún motor de búsqueda araña o usuario malicioso será capaz de ejecutar su tarea programada.

 8
Author: philberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-29 16:32:01

Esta biblioteca funciona como un encanto http://www.codeproject.com/KB/cs/tsnewlib.aspx

Le permite administrar tareas programadas de Windows directamente a través de su código.NET.

 4
Author: labilbe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-04 17:30:10

Además, si su aplicación utiliza SQL SERVER, puede usar el agente SQL para programar sus tareas. Aquí es donde comúnmente ponemos código recurrente que está impulsado por datos (recordatorios de correo electrónico, mantenimiento programado, purgas, etc...). Una gran característica que está integrada con el agente SQL son las opciones de notificación de errores, que pueden alertarlo si falla una tarea crítica.

 3
Author: Zachary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-13 17:13:49

No estoy seguro de qué tipo de tareas programadas quieres decir. Si te refieres a cosas como " cada hora, refresca foo.xml " escriba tareas y, a continuación, utilice el sistema de tareas programadas de Windows. (El comando "at", o a través del controlador.) Haga que ejecute una aplicación de consola o solicite una página especial que inicie el proceso.

Editar: Debo agregar, esta es una buena manera de que su aplicación IIS se ejecute en puntos programados también. Así que supongamos que desea revisar su base de datos cada 30 minutos y enviar recordatorios por correo electrónico a los usuarios sobre algunos datos, puede usar tareas programadas para solicitar esta página y, por lo tanto, obtener IIS procesando cosas.

Si sus necesidades son más complejas, puede considerar crear un Servicio de Windows y hacer que ejecute un bucle para hacer cualquier procesamiento que necesite. Esto también tiene la ventaja de separar el código para fines de escalado o administración. En el lado negativo, debe lidiar con los servicios de Windows.

 2
Author: MichaelGG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-12 19:12:50

Si posee el servidor, debe usar el programador de tareas de Windows. ¿Usar EN/? desde la línea de comandos para ver las opciones.

De lo contrario, desde un entorno basado en web, es posible que tenga que hacer algo desagradable como configurar una máquina diferente para realizar solicitudes a una página determinada en un intervalo de tiempo.

 2
Author: t3rse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-12 19:13:56

He utilizado Abidar con éxito en un ASP.NET proyecto (aquí hay algo de información de antecedentes ).

El único problema con este método es que las tareas no se ejecutarán si el ASP.NET la aplicación web se descarga de la memoria (es decir. debido al bajo uso). Una cosa que intenté es crear una tarea para golpear la aplicación web cada 5 minutos, manteniéndola viva, pero esto no parecía funcionar de manera confiable, así que ahora estoy usando el programador de Windows y la aplicación de consola básica para hacer esto en su lugar.

La solución ideal es crear un servicio de Windows, aunque esto podría no ser posible (es decir. si está utilizando un entorno de alojamiento compartido). También hace las cosas un poco más fáciles desde una perspectiva de mantenimiento para mantener las cosas dentro de la aplicación web.

 2
Author: Mun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-12 19:43:05

Aquí hay otra manera:

1) Cree un script web "heartbeat" que sea responsable de lanzar las tareas si están vencidas o vencidas para ser lanzadas.

2) Cree un proceso programado en algún lugar (preferentemente en el mismo servidor web) que golpee el script web y lo fuerce a ejecutarse en un intervalo regular. (por ejemplo, la tarea de programación de Windows que inicia silenciosamente el script heatbeat usando IE o whathaveyou)

El hecho de que el código de tarea esté contenido dentro de un script web es puramente por el bien de mantener el código dentro de la base de código de la aplicación web (la suposición es que ambos dependen el uno del otro), lo que sería más fácil de administrar para los desarrolladores web.

El enfoque alternativo es crear un script / programa de servidor ejecutable que haga todo el trabajo de programación y ejecute el ejecutable como una tarea programada. Esto puede permitir un desacoplamiento fundamental entre la aplicación web y la tarea programada. Por lo tanto, si necesita sus tareas programadas para ejecutar incluso en el incluso que la aplicación web / base de datos podría estar abajo o inaccesible, usted debe ir con este enfoque.

 1
Author: Matias Nino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-13 18:50:24

Puede crear fácilmente un Servicio de Windows que ejecute código en intervalo usando el 'ThreadPool.RegisterWaitForSingleObject' método. Es realmente ingenioso y bastante fácil de configurar. Este método es un enfoque más simplificado que utilizar cualquiera de los temporizadores en el Marco.

Echa un vistazo al siguiente enlace para obtener más información:

Ejecutar un Proceso Periódico en. NET usando Windows Service:
http://allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html

 1
Author: atconway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-04 18:36:49

También usamos aplicaciones de consola. Si utiliza herramientas de registro como Log4net, puede supervisar correctamente su ejecución. Además, no estoy seguro de cómo son más difíciles de mantener que una página web, dado que puede estar compartiendo algunas de las mismas bibliotecas de código entre los dos si está diseñado correctamente.

Si está en contra de que esas tareas se ejecuten de forma temporizada, podría tener una página web en su sección administrativa de su sitio web que actúe como una cola. El usuario realiza una solicitud para ejecutar la tarea, a su vez inserta un registro datestamp en blanco en la tabla MyProcessQueue y su tarea programada está revisando cada X minutos para un nuevo registro en MyProcessQueue. De esa manera, solo se ejecuta cuando el cliente quiere que se ejecute.

Espero que esas sugerencias ayuden.

 0
Author: Kyle Ballard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-12 19:13:31

Una opción sería configurar un servicio de Windows y hacer que llame a su tarea programada.

En winforms he utilizado temporizadores puesto no creo que esto funcionaría bien en ASP.NET

 0
Author: AJM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-12 19:15:53

Una Nueva Biblioteca de clases del Programador de Tareas para. NET

Nota: Desde que se creó esta biblioteca, Microsoft ha introducido un nuevo programador de tareas (Programador de tareas 2.0) para Windows Vista. Esta biblioteca es un envoltorio para la interfaz del Programador de tareas 1.0, que todavía está disponible en Vista y es compatible con Windows XP, Windows Server 2003 y Windows 2000.

Http://www.codeproject.com/KB/cs/tsnewlib.aspx

 -1
Author: Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-25 11:42:36