Alain López Jiménez

sábado, 9 de mayo de 2009

Cada X-tiempo ejecutar un proceso en una aplicación web.

Esto surgió porque necesito generar automáticamente un archivo xml cada cierto tiempo en una aplicación web. Estuve Googleando y encontré que podía hacerlo con un Application Services. La desventaja de tomar esta solución era que la web se montaría en un Hosting y los administradores no me iban a dejar correr ahí el Application Services :(

Seguí buscando hasta que en el MSDN Social encontré un debate llamado “Proceso automático cada cierto tiempo” en el cual, aunque no estaba la respuesta final se debatía sobre ella, así que cree mi código en base a eso y bingo :)

Lo que haré a continuación será poner la solución que tome a este problema.

Utilice la clase System.Threading.Timer que proporciona un mecanismo para ejecutar métodos en intervalos especificados.

Creando la variable Timer en la función Application_Start del archivo Global.asax garantizamos que cada ves que se reinicie la aplicación se vuelva a settear.

void Application_Start(object sender, EventArgs e){

Application["MyThread"] = new System.Threading.Timer(new System.Threading.TimerCallback(MyActions), null, new TimeSpan(0, 0, 0, 0, 0), new TimeSpan(0, 1, 0, 0, 0));

}

Nota: es importante que asignen a una variable de aplicación (Application["MyThread"]) y no a Timer t = new … porque sino solo se ejecuta el método cuando se inicia la apliacion.

Otro detalle a tener en cuenta es que el reciclado de ASP.NET es frecuente, por lo que si quieren ejecutar el método cada 24 horas puede que nunca pase, para eso lo mejor es que se ejecute mas seguido y guardar la última hora en un archivo, puede ser una base de datos. En mi caso opte por un XML.

La función MyActions la implementé en el Global.asax

private void MyActions(object state){

string basedirectory = AppDomain.CurrentDomain.BaseDirectory;

string config_path = System.IO.Path.Combine(basedirectory, "MyConfig.xml");

System.Xml.Linq.XDocument config = System.Xml.Linq.XDocument.Load(config_path);

TimeSpan diff = DateTime.Now - Convert.ToDateTime(config.Root.Element("last-time").Value);

if (diff.Days>= 1) { … }

}

Debo aclarar que el funcionamiento del servidor no esta disponible en este contexto, por lo que no es posible utilizar:

string config_path = Server.MapPath("MyConfig.xml");

Fin. :p

Etiquetas: , , , ,

3 comentarios:

  • Muy bueno , muy bueno, pero no has considerado Workflow Foundation?

    De Anonymous Anónimo, A las 12 de mayo de 2009, 21:12  

  • Muy buena la solución que has implementado. Yo tengo que hacer lo mismo en ASP.Net, pero una vez por día y con Visual Basic como código.
    Podrías darme una mano con este tema?

    Te agradezco de antemano
    Abrazos
    Fabián

    De Blogger Unknown, A las 5 de junio de 2009, 3:37  

  • hola fabian306

    me gustaría ayudarte pero no tengo acceso a tu Blogger por lo que no he podido contactarte.

    Saludos

    De Blogger Alan, A las 22 de junio de 2009, 20:35  

Publicar un comentario

Suscribirse a Enviar comentarios [Atom]



<< Inicio