Disclaimer: This is a personal web page. Contents written here do not represent the position of my employer.

Sunday, October 28, 2007

 

CallerWatchDog, in case of fire

Últimamente en mi trabajo había que refactorizar (o más bien, tirar a la basura y rehacer) cierto código que implementaba reintentos de llamadas a webservices usando recursividad (con el peligro que ello conlleva, de aumento de memoria por uso de la pila; y más sabiendo que podía hacerse sin recursividad) y ningún tipo de reutilización en el comportamiento del reintento.

Me he pasado gran parte del fin de semana implementando un "CallerWatchdog" que se encargará de hacer este trabajo de manera más eficiente: sin recursividad, sin usar threads adicionales, usando Timers en lugar de Thread.Sleep (de manera que otro Thread pueda matar mi proceso sin obtener excepciones), etc.

Esto me va a permitir cargarme un fichero inmantenible de 3.000 líneas que aún sobrevivía tras el paso de los años. Desde luego que cuando lo haga, y pueda comprobar que la refactorización funciona, va a ser bastante gratificante.

No es que suela ser habitual lo de hacer horas extras (ni siquiera típico cuando hay que apagar algún "fuego", a excepción de la iniciativa propia), pero ya que deduzco que seguramente no me las pagarán, me voy a tomar la libertad de liberar, válgame la redundancia, esta pequeña porción de trabajo hecho en mi tiempo libre. Al fin y al cabo, lo voy a modificar ligeramente para que se adapte al sistema de logs de mi empresa, así que no veo ningún tipo de problema en ello (máxime cuando, como ya sabrá mucha gente, es factible saltarse las restricciones de la GPL siempre que el que lo hace sea el propio autor).

Lo podéis encontrar en esta entrada de MonoPort. Al final del todo encontraréis ejemplos de su uso.

Lo que más me gusta de mi solución es que, a pesar de ser tremendamente genérica (válida para cualquier tipo de método que no tenga más de un parámetro, con lo que podemos encapsular cualquier cosa que use más mediante objetos o estructuras), no me he saltado la estaticidad de tipos mediante reflection, sino que he utilizado delegados y tipos genéricos. Seguramente este tipo de cosas son más fáciles de hacer en un lenguaje dinámicamente tipado, pero sinceramente no creo que valga la pena arriesgar el resto del sistema sólo por este tipo de funciones genéricas puntuales.

Labels: , , ,


Comments: Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?

Categories

RSS of the category Gnome
RSS of the category Mono
RSS of the category C#
RSS of the category Programming
RSS of the category Mozilla
RSS of the category Web Development
RSS of the category Security
RSS of the category Open Source
RSS of the category Engineering
RSS of the category Misc
RSS of the category Politics

Contact with me:
aaragonesNOSPAMes@gnNOSPAMome.org

Archive
My Photo
Name:
Location: Hong Kong, Hong Kong
Follow me on Twitter