none
Disparador de acción RRS feed

  • Pregunta

  • Hola, quisiera saber como puedo implementar un disparador de una accion que debe realizar ciertas tareas cada 24 horas, sera un timer? o hay alguna opcion? y si es un timer, como lo aplico al MVC2?

    Saludos cordiales

    domingo, 10 de abril de 2011 20:48

Respuestas

  • Bufff...

    A ver, no hay nada built-in que puedas usar para disparar una acción cada x tiempo...

    No hay nada que te impida crear un temporizador en Global.asax (a nivel de variable de aplicación) y ponerlo en marcha. Y funcionará. Aquí tienes un ejemplo: http://www.mikesdotnetting.com/Article/129/Simple-task-Scheduling-using-Global.asax. No es la única manera, se puede simular lo mismo usando la Cache de ASP.NET como explican en http://www.codeproject.com/KB/aspnet/ASPNETService.aspx. O puedes usar algo como http://blogs.planetcloud.co.uk/mygreatdiscovery/post/ASPNET-Scheduled-Tasks-with-QuartzNET.aspx

    Pero todas esas maneras, todas, tienen un pequeño problema: No hay manera humana de asegurar que una aplicación web està siempre en marcha. IIS puede decidir parar tu aplicación si durante x tiempo no hay ninguna petición. Al parar tu aplicación, IIS destruye todas las variables de Aplicación (entre ellas tu temporizador), por lo que la acción dejará de realizarse. Cuando llegue otra petición a tu aplicación IIS creará de nuevo todas las variables de aplicación y tu temporizador empezará a actuar de nuevo. No hay ningún ámbito superior al de aplicación: Podrías intentar declarar una variable como static en Global.asax, pero una variable static en Global.asax es realmente una variable de aplicación.

    ¿Y entonces? Pues debes garantizar que IIS jamás parará tu aplicación web por falta de peticiones... Y como hacer esto? Pues conseguir que cada cierto tiempo (p.ej. cada minuto) se haga una petición web... Y como conseguirlo? Pues a través de un programa externo. Es decir, necesitas que se ejecute una aplicación (idealmente un servicio windows) que cada x tiempo, llame a una url de tu aplicación. No es necesario que esta URL haga algo específico, pero al estar recibiendo peticiones, IIS no parará tu aplicación web... con lo cual tu timer no se destruirá. Aquí tienes como construirlo: http://www.nikmakris.com/blog/post/Create-a-Simple-Windows-Service-to-Request-a-URL-at-Set-Intervals.aspx. Otra opción es que esta tarea periódica puedas hacerla directamente desde tu servicio windows (o bien a través del planificador de tareas). Eso dependerá de si las acciones a realizar dependen del estado (de aplicación) del servidor web o no.

    Debes tener en cuenta que incluso en este caso no estás seguro al 100% de que tu aplicación web jamás será destuida: IIS puede decidir reciclar la aplicación (es decir eliminarla y volverla a levantar de nuevo) si se sobrepasan ciertos indicadores. Pero eso, al menos, es más configurable: http://technet.microsoft.com/en-us/library/cc753179(WS.10).aspx Aunque el reciclaje no es tan peligroso: tu timer se parará y se recreará en un momento, por lo que depende de como lo implementes puede suponer un retraso en la ejecución del siguiente intervalo o no.

    En hostings que controles tu, no hay problema, allí instalas la aplicación MVC y todos los servicios que quieras y configuras IIS a tu gusto... Pero en muchos hostings "compartidos" no te dejarán hacerlo. En estos casos, esta aplicación extra debes instalarla en otra máquina (que esté siempre conectada a internet) y que sea la que lanza las peticiones. Si no puedes hacer esto, entonces estás bueno... vendido :) Una técnica que igual te funciona, es cada vez que ejecutes la tarea repetitiva, desde código lanzas una petición contra una URL de tu propia aplicación. De esta manera cada x tiempo (ejecución de la tarea repetitiva) harás lo que tengas que hacer y además lanzarás una petición contra tu propia aplicación, lo que evitará que IIS la aparque. Si el tiempo de tu acción repetitiva es muy grande (p.ej. una vez cada día), necesitarás dos timers: uno para lanzar la petición a una URL de tu propia aplicación web y otro para la acción repetitiva.

    Un saludo! ;-)

     


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
    • Marcado como respuesta Eder Costa miércoles, 10 de octubre de 2012 12:28
    lunes, 11 de abril de 2011 13:00