<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Angel "Java" Lopez : Desarrollo de Software, AjMessages</title><link>http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/AjMessages/default.aspx</link><description>Tags: Desarrollo de Software, AjMessages</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Introducción a AjProcessor (Parte 1)</title><link>http://msmvps.com/blogs/lopez/archive/2009/04/23/introducing_2D00_ajprocessor_2D00_part_2D00_1.aspx</link><pubDate>Thu, 23 Apr 2009 07:46:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1690196</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1690196</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/04/23/introducing_2D00_ajprocessor_2D00_part_2D00_1.aspx#comments</comments><description>&lt;p&gt;En marzo, estuve trabajando en el c&amp;oacute;digo de AjProcessor, parte de mi proyecto de Code Kata en Google:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/AjProcessor"&gt;http://code.google.com/p/ajcodekatas/source/browse#svn/trunk/AjProcessor&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La idea es la evoluci&amp;oacute;n de c&amp;oacute;digo experimental que hice con &lt;a target="_blank" href="http://ajlopez.wordpress.com/category/ajmessages/"&gt;AjMessages&lt;/a&gt; y otros ejemplos. Quiero tener una aplicaci&amp;oacute;n, basada en el pasaje de mensajes, que pueda ejecutar en una grilla de m&amp;aacute;quinas heterog&amp;eacute;neas. La aplicaci&amp;oacute;n podr&amp;iacute;a ser dividida en pasos, y cada paso podr&amp;iacute;a ejecutar en la misma m&amp;aacute;quina, para prueba local, o en distintas m&amp;aacute;quinas. El despliegue de la aplicaci&amp;oacute;n en distintas m&amp;aacute;quinas deber&amp;iacute;a ser transparente a la escritura del c&amp;oacute;digo de la aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Alguno de esos objetivos fueron alcanzados con AjMessages, pero esta vez, quiero partir de una base m&amp;aacute;s limpia, basada en las lecciones aprendidas en los anteriores intentos.&lt;/p&gt;
&lt;p&gt;Primero, quiero pasar en limpio algunas ideas b&amp;aacute;sicas, para explicar la motivaci&amp;oacute;n del c&amp;oacute;digo que est&amp;aacute; apareciendo en el proyecto. La idea b&amp;aacute;sica es tener lo que llamo processors, procesadores, c&amp;oacute;digo que recibe un mensaje y lo procesa.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor01.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;El mensaje tiene un payload, contenido, que puede ser un objeto arbitrario, un string, o cualquier otra cosa, y propiedades adicionales, en forma de pares clave/valor.&lt;/p&gt;
&lt;p&gt;Otro ladrillo esencial en esta aplicaci&amp;oacute;n tipo lego, es el elemento que publica mensajes. Hay entonces un publisher:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor02.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;El mensaje saliente puede ser recibido por cualquier otro c&amp;oacute;digo. El mismo mensaje puede ser procesado por m&amp;aacute;s de otro Processor:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor03.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Es como el patr&amp;oacute;n publish/subscribe. Otro patr&amp;oacute;n a tomar en cuenta, es un componente tipo router. Dependiendo de algo del mensaje (propiedad, contenido), o del entorno (balanceo de carga), env&amp;iacute;a el mensaje a diferentes destinos.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor04.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Muchas veces, un componente implementar&amp;aacute; ambos roles, de de Message Processor y el de Message Publisher. Para facilitar la llamada a objetos .NET comunes, ser&amp;iacute;a bueno tener un procesador que reciba un mensaje, toma una parte del mismo (por ejemplo, el contenido), y lo env&amp;iacute;a como par&amp;aacute;metro a un m&amp;eacute;todo del objeto .NET. El valor de retorno podr&amp;iacute;a ser tomado como contenido de un nuevo mensaje saliente.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor05.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Los componentes pueden ser dispuestos en cadena, implementando una especie de pipeline/tuber&amp;iacute;a donde procesar un mensaje:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor06.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Una disposici&amp;oacute;n m&amp;aacute;s compleja ser&amp;iacute;a recibir un mensaje, y reenviarlo a diferentes pipelines, seg&amp;uacute;n el contenido o propiedad del mensaje entrante. Y tomar los mensajes salientes de los pipelines, para reenviarlos al pr&amp;oacute;ximo paso.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor07.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;(este concepto podr&amp;iacute;a ser mapeado al concepto de Application en AjMessages, pero sin la idea de procesacimiento distribuido). Una idea m&amp;aacute;s interesante es ejecutar una especie de ruteadores a pipelines, pero en varias m&amp;aacute;quinas&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.todocontenidos.com/images/articles/ajprocessor08.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;La infraestructura de AjProcessor estar&amp;iacute;a a cargo de la serializaci&amp;oacute;n, deserializaci&amp;oacute;n y ruteo de mensajes entre distintas m&amp;aacute;quinas anfitrionas. Podr&amp;iacute;a enviar mensajes usando Windows Communication Foundation (WCF), o cualquier otra tecnolog&amp;iacute;a. La idea es tener un trasporte que se pueda agregar o definir, en configuraci&amp;oacute;n, sin afectar al funcionamiento de la aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Bien, todas estas son las ideas iniciales que forman el fundameto el proyecto. En un pr&amp;oacute;ximo espero explicar algo del c&amp;oacute;digo actual (apenas algunas interfaces, clases de implementaci&amp;oacute;n y tests).&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez &lt;br /&gt;&lt;a href="http://www.ajlopez.com/en"&gt;http://www.ajlopez.com/en&lt;/a&gt; &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1690196" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Desarrollo+de+Software/default.aspx">Desarrollo de Software</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/AjMessages/default.aspx">AjMessages</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Grid+Computing/default.aspx">Grid Computing</category></item></channel></rss>