Se me plantea la siguiente necesidad:
"… tenemos un proceso complejo de trasferencia de datos entre dos sistemas construido en una aplicación de consola dotnet. Como es muy compleja, no podemos tocarla, es decir es un Pragma[1] para nosotros. Necesitamos controlar la ejecución de este proceso, es decir que se ejecute y si hay errores se notifique a los administradores…… ¿Qué podemos hacer?…."
Bueno, al ser una aplicación dotnet, la cosa se pone simple. Si usted nunca se ha detenido a considerar que significa que dotnet use código administrado, prepárese porque aquí va a disfrutar una de las ventajas de este tipo de código.
La solución más simple para esto es hacer que una aplicación que llamaremos "Controlador" sea quien ejecute el "Pragama" que llamaremos en este Post "Proceso". La idea es que el Controlador ejecute el Proceso en su mismo AppDomain[2] utilizando las facilidades que el Framewok da para ello. Esto se muestra en el siguiente código. Específicamente se usa el método ExecuteAssembly[3].
static {
Console.WriteLine("Ejecutar?"); Console.WriteLine("Ingrese Argumento de Control: "); strArgumentoControl[0] = Console.ReadLine();
{
@"..\Proceso\bin\Debug\Proceso.exe",null,strArgumentoControl ); }
{ Console.WriteLine("Error: " + X.Message);
} Console.ReadLine(); } |
Código 1
Lo que hace esto es ejecutar en el mismo dominio de aplicación el Proceso, que está implementado en Proceso.exe. El tercer argumento del método los argumentos que se le pasan al programa que se está ejecutando.
Hasta ahora nada muy impresionante, esto es lo bueno. Si en el Proceso.exe se levanta una excepción (aspecto que dotnet maneja muy bien) está es atrapada por el Try/Catch del Controlador. Esto es porque los dos programan son código administrado y pueden compartir la información de las excepciones.
Veamos el Proceso de ejemplo, está en el código 2. Dependiendo del argumento que se le pase Proceso levanta diferentes Excepciones o termina de manera exitosa. Fíjense que no se controlan excepciones aquí, la idea es que si el proceso falla por cualquier motivo sea el Controlador quien se haga cargo.
class {
{ Console.WriteLine("Ejecutando Proceso Controlado……………");
{
Double dNada; dNada = 100 / iCero;
Console.WriteLine("Todo Bien :)");
} Console.WriteLine("Terminó Proceso Controlado……………"); } } |
Código 2
Eso es todo, esto puede ser mucho más sofisticado agregando lógica en Controlador para que distinga los tipos de excepciones, notificaciones, reintentos, etc…etc…
El Código de ejemplo pueden descargarlo desde Aquí
Referencias
[1] Pragma, Pragma a diferencia de un sistema, es algo que se usa "por los bordes" Es decir no se comprende su interior.
[2] AppDomain, http://msdn2.microsoft.com/en-us/library/system.appdomain.aspx
[3] ExecuteAssembly, http://msdn2.microsoft.com/en-us/library/system.appdomain.executeassembly.aspx
En lo simple esta lo supremo :), muy buen post, bastante util =)
Hola,
Sí lo simple es bueno y aplica perfectamente con el requerimiento solicitado.
Siempre he pensado que la ingeniería es solucionar problemas con ingenio, pero si esas soluciones además son simples es un punto extra.
Salu2