La mejor forma de ejecutar tareas progtwigdas

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

Actualizar:

Ejemplos de tareas:

  • Enviar 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 completar una tabla en la base de datos.

Todas mis tareas (que deben progtwigrse) para un sitio web se guardan en el 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, ejecuto la página de nuevo, de inmediato, de lo contrario lo ejecuto en un momento. Esto me ha funcionado muy bien y mantiene toda la lógica de mi tarea con el código web. Antes de escribir el simple servicio de Windows, utilicé el progtwigdor de Windows 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 verificación http a la página que ejecuta su código de servicio. Haga que la página devuelva resultados que luego se pueden usar para activar Pingdom y enviar mensajes de alerta cuando algo no está bien.

Esta técnica de Jeff Atwood para Stackoverflow es el método más simple que he encontrado. Se basa en el mecanismo de callback del “elemento de caché eliminado” en el sistema de caché de ASP.NET

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

También echa un vistazo a Quartz.NET

Crea un servicio personalizado de Windows .

Tuve algunas tareas de misión crítica configuradas como aplicaciones de consola progtwigdas y las encontré difíciles de mantener. Creé un servicio de Windows con un “latido” que verificaba un cronogtwig en mi base de datos cada dos minutos. Funcionó muy bien.

Habiendo dicho eso, todavía uso aplicaciones de consola progtwigdas para la mayoría de mis tareas de mantenimiento no críticas. Si no está roto, no lo arregles.

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

  • Crear un método de servicio web como DoSuchAndSuchProcess
  • Crea una aplicación de consola que llame a este método web.
  • Programe la aplicación de la consola en el progtwigdor 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 comerciales para iniciar y registrar cualquier información de retorno, como un 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.

Por qué reinventar la rueda, use 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 } 

Use Windows Scheduler para ejecutar una página web.

Para evitar que el usuario malicioso o las arañas de los motores de búsqueda lo ejecuten, cuando configure la tarea progtwigda, simplemente llame a la página web con una cadena de consulta, es decir: mypage.aspx? From = scheduledtask

Luego, en la carga de la página, simplemente use una condición: if (Request.Querystring [“from”] == “scheduledtask”) {// executetask}

De esta forma, ninguna araña de motor de búsqueda o usuario malintencionado podrá ejecutar su tarea progtwigda.

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

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

Además, si su aplicación usa SQL SERVER, puede usar el Agente SQL para progtwigr sus tareas. Aquí es donde comúnmente colocamos código de nueva generación basado en datos (recordatorios de correo electrónico, mantenimiento progtwigdo, purgas, etc.). Una gran característica que está incorporada con el Agente de SQL son las opciones de notificación de fallas, que pueden alertarlo si falla una tarea crítica.

No estoy seguro de a qué tipo de tareas progtwigdas te refieres. Si te refieres a tareas como “cada hora, actualiza foo.xml”, utiliza el sistema de Tareas progtwigdas 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 añadir, esta es una forma correcta de ejecutar su aplicación IIS también en puntos progtwigdos. Supongamos que desea verificar su base de datos cada 30 minutos y enviar recordatorios por correo electrónico a los usuarios sobre algunos datos, puede usar tareas progtwigdas para solicitar esta página y, por lo tanto, obtener el procesamiento de IIS.

Si sus necesidades son más complejas, podría considerar crear un Servicio de Windows y hacer que ejecute un ciclo para hacer el procesamiento que necesite. Esto también tiene la ventaja de separar el código para escalar o para fines de gestión. En el lado negativo, debe ocuparse de los servicios de Windows.

Si posee el servidor, debe usar el progtwigdor de tareas de Windows. Use AT /? desde la línea de comando para ver las opciones.

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

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

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

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 facilita un poco las cosas desde la perspectiva del mantenimiento para mantener las cosas dentro de la aplicación web.

Aquí hay otra forma:

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

2) Cree un proceso progtwigdo en algún lugar (preferiblemente en el mismo servidor web) que acceda al script y lo obligue a ejecutarse a intervalos regulares. (por ejemplo, la tarea de progtwigción de Windows que inicia silenciosamente el script de heatbeat usando IE o lo que quieras)

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

El enfoque alternativo es crear un script / progtwig de servidor ejecutable que haga todo el trabajo de progtwigción y ejecute el ejecutable como una tarea progtwigda. Esto puede permitir el desacoplamiento fundamental entre la aplicación web y la tarea progtwigda. Por lo tanto, si necesita que sus tareas progtwigdas se ejecuten incluso en el caso de que la aplicación / base de datos web esté inactiva o sea inactiva, debe seguir este enfoque.

Puede crear fácilmente un servicio de Windows que ejecute código en intervalos utilizando el método ‘ThreadPool.RegisterWaitForSingleObject’. Es realmente resbaladizo y bastante fácil de configurar. Este método es un enfoque más simplificado para usar cualquiera de los temporizadores en el marco.

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

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

Usamos aplicaciones de consola también. Si usa herramientas de registro como Log4net, puede controlar su ejecución correctamente. Además, no estoy seguro de cómo son más difíciles de mantener que una página web, dado que puede compartir algunas de las mismas bibliotecas de códigos entre las dos si está diseñada correctamente.

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

Espero que esas sugerencias te ayuden.

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

En winforms que he usado Timers put no creo que esto funcione bien en ASP.NET

Una nueva biblioteca de clases del Progtwigdor de tareas para .NET

Nota: Desde que se creó esta biblioteca, Microsoft ha introducido un nuevo progtwigdor de tareas (Progtwigdor de tareas 2.0) para Windows Vista. Esta biblioteca es un contenedor para la interfaz Task Scheduler 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