<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/1.5.1-alpha" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
>

<channel>
	<title>Julio César Pérez Arques</title>
	<link>http://jcesarperez.blogsome.com</link>
	<description>Blog de</description>
	<pubDate>Sat, 23 Feb 2008 18:51:47 +0000</pubDate>
	<generator>http://wordpress.org/?v=1.5.1-alpha</generator>
	<language>en</language>

		<item>
		<title>Goodbye blogsome</title>
		<link>http://jcesarperez.blogsome.com/2008/02/23/goodbye-blogsome/</link>
		<comments>http://jcesarperez.blogsome.com/2008/02/23/goodbye-blogsome/#comments</comments>
		<pubDate>Sat, 23 Feb 2008 18:51:47 +0000</pubDate>
		<dc:creator>jcesarperez</dc:creator>
		
	<category>ALL</category>
		<guid>http://jcesarperez.blogsome.com/2008/02/23/goodbye-blogsome/</guid>
		<description><![CDATA[	He decidido cambiar de blog. A partir de ahora podeis encontrarme en&nbsp;http://jcesarperez.blogspot.com/,&nbsp;aunque continuaré manteniendo este blog para no perder sus contenidos ya que en principio no tengo pensado mudarlos.
	Un saludo y muchas gracias por vuestras visitas, emails y comentarios.
]]></description>
			<content:encoded><![CDATA[	<p>He decidido cambiar de blog. A partir de ahora podeis encontrarme en&nbsp;<a href="http://jcesarperez.blogspot.com/">http://jcesarperez.blogspot.com/</a>,&nbsp;aunque continuaré manteniendo este blog para no perder sus contenidos ya que en principio no tengo pensado mudarlos.</p>
	<p>Un saludo y muchas gracias por vuestras visitas, emails y comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://jcesarperez.blogsome.com/2008/02/23/goodbye-blogsome/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Cómo configurar el arranque de Eclipse</title>
		<link>http://jcesarperez.blogsome.com/2007/11/09/configurando-el-arranque-de-eclipse/</link>
		<comments>http://jcesarperez.blogsome.com/2007/11/09/configurando-el-arranque-de-eclipse/#comments</comments>
		<pubDate>Fri, 09 Nov 2007 18:04:14 +0000</pubDate>
		<dc:creator>jcesarperez</dc:creator>
		
	<category>ALL</category>
	<category>Java</category>
	<category>Eclipse</category>
		<guid>http://jcesarperez.blogsome.com/2007/11/09/configurando-el-arranque-de-eclipse/</guid>
		<description><![CDATA[Cómo configurar el arranque de Eclipse (jvm, memoria heap y permgen)]]></description>
			<content:encoded><![CDATA[	<p>Todos hemos oido hablar de las mejoras de rendimiento de Java 6, especialmente para aplicaciones de escritorio,&nbsp;entonces &iquest;por qué no usar Java 6 para&nbsp; ejecutar&nbsp;Eclipse aunque desarrollemos con&nbsp;Java 5 o incluso&nbsp;Java 1.4? Sí, a algunos nos obligan a seguir viviendo en la prehistoria. Pero&#8230;&nbsp;&iquest;cuantás maquinas virtuales (jvm) tenemos instaladas? &iquest;Sabemos con cúal arranca Eclipse?</p>
	<p>Cuando <a href="http://wiki.eclipse.org/index.php/FAQ_How_do_I_run_Eclipse?" target="_blank">arrancamos</a> Eclipse&nbsp;se usa la jvm que se encuentra en la variable PATH del sistema, aunque luego tengamos configurado que para los proyectos use&nbsp; otra jvm. Afortunadamente ésto es facilmente configurable, basta con editar el fichero <em>eclipse.ini</em>, que se encuentra en el raiz del directorio del Eclipse y a&ntilde;adir la siguiente línea con la ruta al javaw que quieras usar:</p>
	<p class="source-code">-vm<br />c:/java/jre6/bin/javaw.exe</p>
	<p>En este fichero&nbsp;también podemos tunear el tama&ntilde;o inicial y máximo de las memorias heap y permgen. La solución a esos cuelgues repentinos&nbsp;o los inoportunos outofmemory cuando estamos con varios proyectos, servidores, plugins, etc.&nbsp;abiertos en eclipse. Recuerda que por defecto la jvm sólo usa 64MB.</p>
	<p>La memoria heap es la asignada de forma dinámica y que puede ser liberada por el recolector de basura. Para configurar los valores inicial y máximo se usan los parametros de la jvm <em>-Xms</em> y <em>-Xmx</em> respectivamente. Por ejemplo, en mi equipo, que tiene 1GB de RAM,&nbsp;tengo las siguiente líneas en el eclipse.ini:</p>
	<p class="source-code">-vmargs<br />-Xms128m<br />-Xmx512m</p>
	<p>La memoria permgen es memoria que se asigna de forma permanente y, por tanto, no puede ser liberada. En el eclipse.ini del Eclipse 3.3 ya se <a href="http://wiki.eclipse.org/FAQ_How_do_I_increase_the_permgen_size_available_to_Eclipse?" target="_blank">incluye</a> la siguiente línea para gestionar su tama&ntilde;o máximo:</p>
	<p class="source-code">&#8211;launcher.XXMaxPermSize<br />256m</p>
	<p>Aun así, se pueden utilizar los parametros <em>-XX:PermSize</em> y <em>-XX:MaxPermSize</em> de la jvm para configurar los tama&ntilde;os inicial y máximo de la memoria permgen. Por ejemplo, estas serian las líneas a a&ntilde;adir para un tama&ntilde;o inicial de 128MB y máximo de 256MB:</p>
	<p class="source-code">-XX:PermSize=128m<br />-XX:MaxPermSize=256m </p>
]]></content:encoded>
			<wfw:commentRss>http://jcesarperez.blogsome.com/2007/11/09/configurando-el-arranque-de-eclipse/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Ayuda para diseñar XSDs y WSDLs</title>
		<link>http://jcesarperez.blogsome.com/2007/10/28/ayuda-para-disenar-xsds-y-wsdls/</link>
		<comments>http://jcesarperez.blogsome.com/2007/10/28/ayuda-para-disenar-xsds-y-wsdls/#comments</comments>
		<pubDate>Sun, 28 Oct 2007 10:39:03 +0000</pubDate>
		<dc:creator>jcesarperez</dc:creator>
		
	<category>ALL</category>
	<category>SOA</category>
	<category>Architecture</category>
		<guid>http://jcesarperez.blogsome.com/2007/10/28/ayuda-para-disenar-xsds-y-wsdls/</guid>
		<description><![CDATA[Referencias de ayuda para aprender a diseñar schemas XSD y  ficheros WSDL.]]></description>
			<content:encoded><![CDATA[	<p>Viendo el referers del blog he observado que son muchos los que buscan ayuda para dise&ntilde;ar schemas XSD y ficheros WSDL.</p>
	<p>Desconozco si los posts del blog fueron de ayuda o no, así que os dejo unos enlaces al genial curso de Shang Shin donde seguro podreis aprender todo lo necesario para dominar esto de XSDs y WSDLs usando como herramienta el nuevo <a href="http://www.netbeans.org/community/releases/60/index.html" target="_blank">Netbeans 6 Beta 2</a>.</p>
	<p><a href="http://www.javapassion.com/webservices/" target="_self">Web Services and SOA Programming (with Passion!) Hands-on Online Course</a></p>
	<p><a href="http://www.javapassion.com/webservices/index.html#XML_Schema" target="_blank">Schemas</a> y <a href="http://www.javapassion.com/webservices/#XML_Schema_Design_Pattern" target="_self">patrones de dise&ntilde;o</a>.</p>
	<p><a href="http://www.javapassion.com/webservices/index.html#WSDL_Basics" target="_blank">WSDL básico</a> y <a href="http://www.javapassion.com/webservices/index.html#WSDL_Binding" target="_blank">avanzado</a>.</p>
	<p>No os quedeis en las transparencias y&nbsp;los videos y echarle un ojo a los recursos también.</p>
	<p>Podeis aprovechar también para aprender a usar las herramientas <a href="http://www.javapassion.com/webservices/index.html#soapUI" target="_blank">soapUI</a> y <a href="http://www.javapassion.com/webservices/index.html#WS_Monitor" target="_blank">WS Monitor</a>&nbsp;que seguro os sacarán de más de un apuro en alguna ocasión. Además SoapUI lo podeis usar para hacer pruebas de stress a vuestros webservices como alternativa a&nbsp;<a href="http://jakarta.apache.org/jmeter/" target="_blank">JMeter</a>.</p>
	<p>Por mi parte, siento el parón en los contenidos pero cambié de trabajo recientemente y, para mi pesar, ya ni me dedico profesionalmente&nbsp;a&nbsp;webservices&nbsp;ni tengo mucho tiempo para echarle en casa.</p>
]]></content:encoded>
			<wfw:commentRss>http://jcesarperez.blogsome.com/2007/10/28/ayuda-para-disenar-xsds-y-wsdls/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Behind Closed Doors: Secrets of Great Management</title>
		<link>http://jcesarperez.blogsome.com/2007/08/29/behind-closed-doors-secrets-of-great-management/</link>
		<comments>http://jcesarperez.blogsome.com/2007/08/29/behind-closed-doors-secrets-of-great-management/#comments</comments>
		<pubDate>Wed, 29 Aug 2007 15:38:32 +0000</pubDate>
		<dc:creator>jcesarperez</dc:creator>
		
	<category>ALL</category>
	<category>Libros</category>
		<guid>http://jcesarperez.blogsome.com/2007/08/29/behind-closed-doors-secrets-of-great-management/</guid>
		<description><![CDATA[Behind Closed Doors: Secrets of Great Management - Un libro sobre gestión de grupos de la serie The Pragmatic Programmer]]></description>
			<content:encoded><![CDATA[	<p><img style="width: 115px; height: 170px" height="170" hspace="10" src="http://www.pragprog.com/images/covers/190x228/rdbcd.jpg?1184184147" width="115" align="left" vspace="2" border="0" />Hacía tiempo que llevaba oyendo maravillas de la serie de libros <a href="http://www.pragmaticprogrammer.com/" target="_blank">The Pragmatic Programmer</a> y tenía muchas ganas de pillar uno.&nbsp; Por otro lado, mi cambio de trabajo a un rol con más&nbsp;gestión&nbsp;casi me obligaba a que el próximo libro que ocupara mi mesilla de noche fuera&nbsp;sobre&nbsp;<em>management</em>.</p>
	<p>En <a href="http://www.pragmaticprogrammer.com/titles/rdbcd/" target="_blank">Behind Closed Doors: Secrets of Great Management</a> podemos leer siete semanas de la vida de Sam, un manager de nivel medio, y aprender cómo realizar las&nbsp;funciones de gestión típicas del día a día de un responsable de equipo, como delegar tareas, dar feedback, fijar objetivos, manejar reuniones, hacer equipo, controlar el progreso de un proyecto, actuar ante los cambios, etc. sin meterse en ninguna metodología concreta.</p>
	<p>El libro mezcla de forma muy acertada una parte práctica (la vida de Sam) con una parte teórica donde se describen las técnicas a usar, haciéndose muy ameno y enganchándote hasta el final. No llega a 160 páginas y usa un inglés fácil de seguir. No es que sea la panacea, lo de los secretos se queda sólo en el título como se podia imaginar, pero si me atrevo a recomendarlo a aquellos que quieran aprender sobre gestión de grupos, sobretodo a cómo&nbsp;manejarse en el día a día. Y es que Sam puede ser un buen ejemplo de buen manager para los que no&nbsp;hemos tenido demasiados.</p>
]]></content:encoded>
			<wfw:commentRss>http://jcesarperez.blogsome.com/2007/08/29/behind-closed-doors-secrets-of-great-management/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Desarrollar un cliente webservice desde WSDL en Axis2</title>
		<link>http://jcesarperez.blogsome.com/2007/08/26/desarrollar-un-cliente-webservice-desde-wsdl-en-axis2/</link>
		<comments>http://jcesarperez.blogsome.com/2007/08/26/desarrollar-un-cliente-webservice-desde-wsdl-en-axis2/#comments</comments>
		<pubDate>Sun, 26 Aug 2007 15:16:42 +0000</pubDate>
		<dc:creator>jcesarperez</dc:creator>
		
	<category>ALL</category>
	<category>SOA</category>
	<category>Axis2</category>
	<category>Tutorial</category>
	<category>Java</category>
		<guid>http://jcesarperez.blogsome.com/2007/08/26/desarrollar-un-cliente-webservice-desde-wsdl-en-axis2/</guid>
		<description><![CDATA[Tutorial sobre cómo desarrollar un cliente webservice desde WSDL en Axis2]]></description>
			<content:encoded><![CDATA[	<p>En esta ocasión, y como paso lógico después de ver <a href="http://jcesarperez.blogsome.com/2007/07/24/desarrollar-un-webservice-desde-wsdl-con-axis2/" target="_blank">cómo desarrollar un webservice</a>, voy a contar cómo construir un cliente para invocar un webservice utilizando WSDL2Java en Axis2.</p>
	<p>El&nbsp;webservice al que invocará el cliente es el desarrollado en el <a href="http://jcesarperez.blogsome.com/2007/07/24/desarrollar-un-webservice-desde-wsdl-con-axis2/" target="_blank">artículo anterior</a>, myVirtualShop. Puedes descargarlo <a href="http://www.box.net/shared/asi4omikoq" target="_blank">aquí</a> listo para desplegar en el repositorio de Axis2.</p>
	<p><strong>Preliminares</strong><br />Si deseas seguir este tutorial paso a paso debes tener instalado:</p>
	<li>
<div><a href="http://java.sun.com/javase/downloads/index.jsp" target="_blank"><font color="#0066cc">JDK</font></a> 1.4 o superior, con la variable de entorno <em>JAVA_HOME</em> configurada.</div>
</li>
	<li>
<div><a href="http://www.eclipse.org/" target="_blank">Eclipse</a> 3.1 o superior. Con el plugin <a href="http://ws.apache.org/axis2/tools/1_2/eclipse/wsdl2java-plugin.html" target="_blank"><font color="#0066cc">Code Generator Wizard</font></a> de Axis2 instalado (sólo hay que copiarlo a <em>plugins</em> antes de arrancar Eclipse).</div>
</li>
	<li>
<div>Axis2 1.2 Standard Binary Distribution o superior.&nbsp;No olvides configurar&nbsp;la variable de entorno AXIS2_HOME. Si necesitas ayuda para instalar Axis2 puedes consultar el artículo anterior <a title="Instalando Axis2" href="http://jcesarperez.blogsome.com/2007/05/14/instalando-axis2/" target="_blank"><font color="#0066cc">Instalando Axis2</font></a>.</div>
</li>
	<p>Por mi parte he aprovechado para probar la nueva versión 1.3 de Axis2. En teoría sólo mejora el rendimiento y corrije algunos <em>bugs</em>. Con la 1.2 funciona igual.</p>
	<p><strong>En qué consiste</strong><br />Crear&nbsp;un cliente webservice utilizando la herramienta WSDL2Java&nbsp;es realmente sencillo, sólo necesitas&nbsp;tener acceso al WSDL&nbsp;que describe el&nbsp;webservice y ejecutar el WSDL2Java para generar las clases Java correspondientes al cliente.</p>
	<p><strong>Antes de</strong><br />Antes de nada vamos a dejar el webservice desplegado y funcionando. Copia el webservice myVirtualShop.aar al repositorio de Axis2, subcarpeta <em>services</em>, y arranca el servidor con el script <em>axis2server</em> localizado en <em>bin</em>. Comprueba que todo está correcto accediendo al endpoint del webservice en <em>http://localhost:8080/axis2/services/myVirtualShop</em>.</p>
	<p>Ahora con el webservice funcionando podemos centrarnos exclusivamente en el cliente. Lo primero es crear un nuevo proyecto Java, myVirtualShopClient,&nbsp;y configurar su <em>Build Path</em> para&nbsp;a&ntilde;adir los <em>jars</em>&nbsp;de Axis2, localizados en <em>lib</em>. Para independizar al proyecto cliente&nbsp;de la instalación de Axis2 crea una carpeta <em>lib</em> y copia dentro los <em>jars</em> de Axis2. Seleccionalos todos y a&ntilde;adelos al <em>Build Path</em>. Sé que son muchos y que algunos no hacen falta, pero otros dependen de determinadas decisiones que se tomen durante el desarrollo, como la elección del Databinding a utilizar, de si queremos hacer llamadas asíncronas, enviar attachments, etc. Mi recomendación es tenerlos todos disponibles&nbsp;durante el desarrollo y eliminar los jars innecesarios al crear la distribución.</p>
	<p>Lo siguiente es a&ntilde;adir al proyecto el WSDL del webservice y sus schemas asociados. Crea una carpeta <em>resources</em> y copia dentro el <a href="http://www.box.net/shared/z7ivpbxqzr" target="_blank">WSDL</a> y su <a href="http://www.box.net/shared/p7r9h6ur3z" target="_blank">schema</a>. Recuerda borrar las extensiones <em>jpg</em>.&nbsp;A continuación&nbsp;un <em>screenshot</em> de como queda el proyecto.</p>
	<p><a href="http://jcesarperez.blogsome.com/images/myVirtualShopClient_proyecto0.JPG"><img title="" height="89" alt="" src="http://jcesarperez.blogsome.com/images/thumb-myVirtualShopClient_proyecto0.JPG" width="180" border="0" /></a></p>
	<p><strong>Momento&nbsp;WSDL2Java</strong><br />En este punto ya podemos utilizar WSDL2Java para generar de forma automática el código Java para el cliente webservice a partir del fichero WSDL. El código generado incluye un stub cliente para invocar al webservice y las clases Java necesarias para el Databinding de los mensajes XML.&nbsp;Como motor de Databinding vamos a usar <a href="http://ws.apache.org/axis2/1_0/adb/adb-howto.html" target="_blank">adb</a>.</p>
	<p>Para ejecutar WSDL2Java se puede optar por hacerlo mediante una consola,&nbsp;ANT, Maven o un plugin de Eclipse o IDEA. Nosotros vamos a ver cómo usar el plugin de Eclipse&nbsp;<a href="http://ws.apache.org/axis2/tools/1_2/eclipse/wsdl2java-plugin.html" target="_blank"><font color="#0066cc">Code Generator Wizard</font></a>. Es más fácil y descriptivo:</p>
	<ol>
<li>
<div>Pulsa <em>File-&gt;New-&gt;Other-&gt;Axis2 Wizards-&gt;Axis2 Code Generator</em>.</div>
</li>
	<li>
<div>Elije la opción de generar código Java desde un fichero WSDL. Pulsa <em>Next</em>.</div>
</li>
	<li>
<div>Selecciona el fichero <em>myVirtualShop.wsdl</em> localizado en <em>resources</em>. Pulsa <em>Next</em>.</div>
</li>
	<li>
<div>En la pantalla de opciones,&nbsp;selecciona <em>custom</em> como <em>Codegen option</em> e indica <em>org.example.myvirtualshop.wsclient</em> como <em>Custom package name</em>. Fijate que dejamos adb como Databinding y que se va a generar código cliente, tanto para llamadas síncronas como asíncronas. Pulsa <em>Next</em>.</div>
</li>
	<li>
<div>Finalmente selecciona el proyecto <em>myVirtualShopClient</em> como destino del código a generar. Para ello elije la primera opción y elije el proyecto al pulsar el botón <em>Browse</em>. Pulsa <em>Finish</em>.</div>
</li>
</ol>
	<p>En las siguientes imágenes se ilustran los pasos anteriores.</p>
	<p><a href="http://jcesarperez.blogsome.com/images/wsdl2java_client1.jpg"><img title="wsdl2java client - paso 1" height="171" alt="wsdl2java client - paso 1" src="http://jcesarperez.blogsome.com/images/thumb-wsdl2java_client1.jpg" width="180" border="0" /></a><a href="http://jcesarperez.blogsome.com/images/wsdl2java_client2.jpg"><img title="wsdl2java client - paso 2" height="175" alt="wsdl2java client - paso 2" src="http://jcesarperez.blogsome.com/images/thumb-wsdl2java_client2.jpg" width="180" border="0" /></a><a href="http://jcesarperez.blogsome.com/images/wsdl2java_client3.jpg"><img title="wsdl2java client - paso 3" height="175" alt="wsdl2java client - paso 3" src="http://jcesarperez.blogsome.com/images/thumb-wsdl2java_client3.jpg" width="180" border="0" /></a><a href="http://jcesarperez.blogsome.com/images/wsdl2java_client4.jpg"><img title="wsdl2java client - paso 4" height="180" alt="wsdl2java client - paso 4" src="http://jcesarperez.blogsome.com/images/thumb-wsdl2java_client4.jpg" width="164" border="0" /></a><a href="http://jcesarperez.blogsome.com/images/wsdl2java_client5.jpg"><img title="wsdl2java client - paso 5" height="180" alt="wsdl2java client - paso 5" src="http://jcesarperez.blogsome.com/images/thumb-wsdl2java_client5.jpg" width="164" border="0" /></a></p>
	<p>Si refrescas el proyecto podrás ver las clases creadas en el nuevo package <em>org.example.myvirtualshop.wsclient</em>:</p>
	<ul>
<li>
<div><em>MyVirtualShopStub</em>: Esta es la clase stub cliente con la que se pueden invocar las operaciones del webservice. Contiene un método por cada operación del webservice y clases internas que representan los elementos de los mensajes XML (databinding). Además, y como hemos seleccionado el modo asíncrono durante el wsdl2java, existe un método, que empieza por start, para realizar cada operación del webservice de forma asíncrona.</div>
</li>
	<li>
<div><em>MyVirtualShopCallbackHandler</em>: Esta es una clase abstracta que representa el manejador de respuestas asíncronas. Su funcionamiento lo veremos más adelante.</div>
</li>
</ul>
	<p><strong>Despues de</strong><br />Con el cliente ya creado sólo falta&nbsp;incorporar el código Java necesario a nuestra aplicación para crear&nbsp;el mensaje de&nbsp;petición deseado,&nbsp;usar el stub para invocar la operación correspondiente y procesar la respuesta.</p>
	<p>Lo primero es crear una instancia del stub e indicar la URL del endpoint del webservice al que queremos invocar. Ejemplo:</p>
	<p class="source-code">String sEndPoint = &quot;http://localhost:8080/axis2/services/myVirtualShop&quot;;<br />MyVirtualShopStub stub = new MyVirtualShopStub(sEndPoint);</p>
	<p>Construir un mensaje es muy fácil. Existe una clase interna (JavaBean) por cada elemento complejo del mensaje XML que se utiliza para realizar el databinding o mapeo entre objetos Java y XML (y viceversa). Por tanto no es más que ir creando objetos y usar metodos set.&nbsp;Para ver las clases internas puedes ayudarte de la vista Outline del propio Eclipse. Sorpresa! Los incomprensibles sufijos <em>_typeX</em> siguen sin desaparecer en la versión 1.3 de Axis2.</p>
	<p><a href="http://jcesarperez.blogsome.com/images/Outline_stub.jpg"><img title="Outline del stub" height="180" alt="Outline del stub" src="http://jcesarperez.blogsome.com/images/thumb-Outline_stub.jpg" width="94" border="0" /></a></p>
	<p>El siguiente código es un ejemplo de cómo se construiría una petición para la operación <em>Order</em>:</p>
	<p class="source-code">//Elemento raiz del mensaje<br />OrderRequest orderRequest = new OrderRequest();<br />//Elemento Cliente<br />Cliente_type0 cliente = new Cliente_type0();<br />cliente.setNombre(&quot;John Waterfall&quot;);<br />cliente.setDireccion(&quot;NA&quot;);<br />orderRequest.setCliente(cliente);<br />//Elemento items<br />Items_type0 items = new Items_type0();<br />Item_type0[] aItem = new Item_type0[1];<br />//Elemento item<br />aItem[0] = new Item_type0();<br />aItem[0].setRef(&quot;R0001&quot;);<br />aItem[0].setCantidad(100);<br />items.setItem(aItem);&nbsp;&nbsp;<br />orderRequest.setItems(items);</p>
	<p>Para invocar al webservice el stub cuenta con un método por cada operación. Los métodos son <em>getCatalog</em>, <em>search</em>, <em>order</em> y&nbsp;<em>getStateOrder</em>. Estos métodos tienen como parámetro la clase que representa el mensaje petición de la operación y devuelven la correspondiente respuesta. Siguiendo con el ejemplo, lo siguiente sería el código para&nbsp;invocar la operación <em>Order</em> y procesar la respuesta:</p>
	<p class="source-code">OrderResponse orderResponse = stub.order(orderRequest);<br />System.out.println(&quot;** OrderResponse.getIdPedido() = &quot; + orderResponse.getIdPedido());<br />System.out.println(&quot;** OrderResponse.getFechaPrevistaEntrega() = &quot; + orderResponse.getFechaPrevistaEntrega());<br />System.out.println(&quot;** OrderResponse.getgetTotal() = &quot; + orderResponse.getTotal());</p>
	<p>Si deseas ver un ejemplo un poco más completo dónde se invocan las cuatro operaciones del webservice, puedes descargarte la siguiente clase <a href="http://www.box.net/shared/d72ll5mll8" target="_blank">TestClient</a>, copiarla al package <em>org.example.myvirtualshop.wsclient</em> y ejecutar su método <em>main</em>. Asegurate antes de que el webservice se encuentra desplegado y ten cuidado con los nombres de las clases internas del databinding, los números de los sufijos podrían variar.</p>
	<p><strong>Modo asíncrono</strong><br />Una de las novedades de Axis2 es que permite realizar llamadas asíncronas sobre las operaciones de un&nbsp;webservice.</p>
	<p>&iquest;Qué diferencia hay entre una llamada síncrona y asíncrona? Cuando se invoca a un método de forma síncrona o bloqueante, el flujo de control del programa no sigue con la siguiente instrucción hasta que no termina la ejecución del método invocado (el 99.9% de las llamadas en Java). Mientras que cuando se invoca a un método de forma asíncrona o no bloqueante, el flujo de control del programa continua automáticamente con la siguiente instrucción y en otro thread se ejecuta el método invocado (concurrencia).</p>
	<p>Estas llamadas asíncronas forman el patrón de intercambio de mensajes (<a href="http://www.w3.org/TR/soap12-part1/#soapmep" target="_blank">MEP</a>) conocido por <em>In-Only</em> y es&nbsp;muy útil para invocar operaciones de las que no necesitamos una respuesta o no&nbsp;podemos disponer de la respuesta en ese mismo instante.</p>
	<p>Para invocar las operaciones del webservice de forma asíncrona el stub contiene un método por cada operación que se llama igual pero empezando por el prefijo <em>start</em>.&nbsp; Los métodos son <em>startGetCatalog</em>, <em>startSearch</em>, <em>startOrder</em> y&nbsp;<em>startGetStateOrder</em>. Estos métodos tienen dos parametros, el mensaje de petición y el manejador de la respuesta asíncrona (CallbackHandler) que será el encargado de&nbsp;recibir la respuesta de la operación invocada.</p>
	<p>Para crear&nbsp;un CallbackHandler&nbsp;hay que usar, más bien heredar,&nbsp;la clase abstracta CallbackHandler generada por el wsdl2java. Esta clase tiene dos métodos por cada operación del webservice, uno para procesar la respuesta y otro para procesar un posible error en la comunicación. Por tanto habrá&nbsp;que sobreescribir el par de métodos correspondientes a la operación que se vaya&nbsp;a invocar de forma asíncrona con el código para procesar la respuesta de la operación o tratar un posible error.</p>
	<p>Veámoslo en detalle y siguiendo nuestro ejemplo para el webservice&nbsp;MyVirtualShop. Los pasos para poder invocar la operación Order de forma asíncrona serían los siguientes:</p>
	<ol>
<li>Crea una clase que herede de la clase abstracta&nbsp;<em>MyVirtualShopCallbackHandler</em>,&nbsp;llámala <em>OrderCallbackHandler</em>. <a href="http://www.box.net/shared/5j2gvjud2a" target="_blank">Aquí</a> tienes su código.</li>
	<li>Sobreescribe el método <em>receiveResultorder</em> con el siguiente código de ejemplo para procesar la respuesta:<br />
<p class="source-code">public void receiveResultorder(OrderResponse result) {<br />&nbsp;System.out.println(&quot;** Procesando respuesta asíncrona de operación Order&#8230;&quot;);<br />&nbsp;System.out.println(&quot;** OrderResponse.getIdPedido() = &quot; + result.getIdPedido());<br />&nbsp;System.out.println(&quot;** OrderResponse.getFechaPrevistaEntrega() = &quot; + result.getFechaPrevistaEntrega());<br />&nbsp;System.out.println(&quot;** OrderResponse.getgetTotal() = &quot; + result.getTotal());<br />&nbsp;System.out.println(&quot;** Procesando respuesta asíncrona de operación Order&#8230; OK&quot;);<br />}</p>
</li>
	<li>Sobreescribe el método <em>receiveErrororder</em> con el siguiente código de ejemplo para procesar un posible error:<br />
<p class="source-code">public void receiveErrororder(Exception e) {<br />&nbsp;System.out.println(&quot;** Error en invocación asíncrona a operación Order&#8230;&quot;);<br />&nbsp;e.printStackTrace();<br />&nbsp;System.out.println(&quot;** Error en invocación asíncrona a operación Order&#8230; OK&quot;);<br />}</p>
</li>
	<li>Crea una nueva clase, <em>TestAsynClient</em>,&nbsp;con un método main para probar la llamada asíncrona a la operación Order. <a href="http://www.box.net/shared/ep8srje7ej" target="_blank">Aquí</a> tienes su código. El código para crear el stub y la petición es exactamente el mismo que en el ejemplo de más arriba. Sólo cambia el código para hacer la llamada, que sería el siguiente:<br />
<p class="source-code">System.out.println(&quot;\n*** Invocando operacion Order de forma ASÍNCRONA&#8230;&quot;);&nbsp;&nbsp;<br />OneCallbackHandler callback = new OneCallbackHandler();<br />stub.startorder(orderRequest, callback);<br />System.out.println(&quot;*** El flujo de control del programa continua con la siguiente instruccion a la llamada asíncrona\n&quot;);<br />Thread.sleep(10000); //Espera 10s para que no termine el thread main y por tanto el programa sin recibir antes la respuesta</p>
</li>
	<li>Para probarlo ejecuta la clase recién creada. Si quieres probar el caso de receiveError sólo tienes que parar el Axis2 y volver a ejecutar la clase. </li>
</ol>
	<p><strong>Conclusiones</strong><br />Hasta aquí esto es todo. Como habeis visto&nbsp;usar un&nbsp;webservice con Axis2 es rápido y sencillo, pero con otras tecnologías el proceso es muy similar. Que el webservice haya sido creado también con Axis2 es irrelevante. Para crear&nbsp;un cliente sólo necesitamos el wsdl del servicio, es el único punto en común que tienen el cliente y el servicio. Pero, para&nbsp;evitar&nbsp;sorpresas en cuanto a&nbsp;la interoperabilidad&nbsp;se debe&nbsp;desarrollar el wsdl de forma independiente a una tecnología en concreto, sobretodo si es un wsdl complejo. Y a pesar de todo, la interoperabilidad 100% no se puede garantizar. Las sorpresas siempre están ahí, llámense bugs, attachments, estándares,&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://jcesarperez.blogsome.com/2007/08/26/desarrollar-un-cliente-webservice-desde-wsdl-en-axis2/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Entrando a Technorati</title>
		<link>http://jcesarperez.blogsome.com/2007/08/26/entrando-a-technorati-3/</link>
		<comments>http://jcesarperez.blogsome.com/2007/08/26/entrando-a-technorati-3/#comments</comments>
		<pubDate>Sun, 26 Aug 2007 11:26:34 +0000</pubDate>
		<dc:creator>jcesarperez</dc:creator>
		
	<category>Uncategorized</category>
		<guid>http://jcesarperez.blogsome.com/2007/08/26/entrando-a-technorati-3/</guid>
		<description><![CDATA[	Lo que hace tener un poco de tiempo libre&#8230;
	Technorati Post Claim: Technorati Profile
]]></description>
			<content:encoded><![CDATA[	<p>Lo que hace tener un poco de tiempo libre&#8230;</p>
	<p>Technorati Post Claim: <a href="http://technorati.com/claim/hgrqyvkuyh">Technorati Profile</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jcesarperez.blogsome.com/2007/08/26/entrando-a-technorati-3/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Desarrollar un webservice desde WSDL con Axis2</title>
		<link>http://jcesarperez.blogsome.com/2007/07/24/desarrollar-un-webservice-desde-wsdl-con-axis2/</link>
		<comments>http://jcesarperez.blogsome.com/2007/07/24/desarrollar-un-webservice-desde-wsdl-con-axis2/#comments</comments>
		<pubDate>Tue, 24 Jul 2007 11:36:07 +0000</pubDate>
		<dc:creator>jcesarperez</dc:creator>
		
	<category>ALL</category>
	<category>SOA</category>
	<category>Axis2</category>
	<category>Tutorial</category>
	<category>Java</category>
	<category>Architecture</category>
		<guid>http://jcesarperez.blogsome.com/2007/07/24/desarrollar-un-webservice-desde-wsdl-con-axis2/</guid>
		<description><![CDATA[Tutorial sobre cómo desarrollar un webservice (o servicio web) desde WSDL con Axis2]]></description>
			<content:encoded><![CDATA[	<p>Siguiendo&nbsp;con el motor de webservices&nbsp;<a href="http://ws.apache.org/axis2/" target="_blank">Axis2</a>, en esta ocasión toca hablar sobre cómo desarrollar&nbsp;un webservice.&nbsp;Logicamente existen diversas formas&nbsp;de desarrollar un webservice, en el siguiente texto voy a&nbsp;contar cómo desarrollar un webservice siguiendo la metodología conocida por <em>WSDL to Java</em>&nbsp;y qué ventajas reporta. Antes permitidme introduciros brevemente en el mundo de los webservices.</p>
	<p><strong>Presentaciones</strong><br />Un webservice o servicio web es una aplicación modular, auto-contenida, auto-descriptiva, sin estado&nbsp;y accesible a través de Internet. Su objetivo es la <strong>interoperabilidad</strong> entre aplicaciones, con un mínimo acoplamiento e&nbsp;independientemente de la tecnología con la que hayan sido desarrolladas.</p>
	<p><a title="webservices" href="http://jcesarperez.blogsome.com/images/webservices.GIF"><img title="webservices" style="width: 440px; height: 190px" height="190" alt="webservices" src="http://jcesarperez.blogsome.com/images/webservices.GIF" width="440" border="0" /></a></p>
	<p>Para lograr la interoperabilidad, aparte de basarse en estándares, un&nbsp;webservice se comunica mediante mensajes&nbsp;<strong>XML</strong>&nbsp;utilizando el protocolo <a href="http://www.w3.org/TR/soap/" target="_blank">SOAP</a>. El interfaz de un webservice se describe en un documento XML utilizando el estándar <a href="http://www.w3.org/TR/wsdl" target="_blank">WSDL</a>. En este fichero, que&nbsp;recibe el mismo nombre WSDL, se definen los detalles de cómo usar un webservice, como las operaciones, el formato de los mensajes, el tipo y el protocolo de transporte del webservice.</p>
	<p>El WSDL es, por tanto, básico a la hora de crear un cliente para un webservice y debería ser cuidadosamente dise&ntilde;ado. Un buen dise&ntilde;o evitará problemas de interoperabilidad&nbsp;aunque se empleen&nbsp;tecnologías diferentes a la del&nbsp;webservice&nbsp;para crear los clientes. Por ello, debería ser de máxima importancia durante el desarrollo de un webservice.</p>
	<p><strong>Empezando la casa por el tejado</strong><br />Sin embargo, y descartando la opción de parsear los XML a pelo,&nbsp;es habitual encontrarse con un enfoque radicalmente contrario. Partiendo de la implementación de la lógica del&nbsp;webservice&nbsp;(una clase Java) se genera de forma automática el WSDL correspondiente.&nbsp;El nombre de este método es <em><strong>Java&nbsp;to WSDL</strong></em>. Pero al seguirlo estamos condicionando la interoperabilidad del&nbsp;webservice a la bondad de la herramienta empleada para generar el WSDL.&nbsp;A cambio se&nbsp;facilita el desarrollo (ahora incluso con anotaciones) del webservice.</p>
	<p>Este enfoque&nbsp;funciona&nbsp;bien para servicios web realmente sencillos, con métodos de&nbsp;pocos parametros de tipo básico. Pero puede (casi seguro) dar problemas de interoperabilidad&nbsp;en&nbsp;webservices con mensajes complejos si se usan tecnologías distintas (aunque sean del mismo lenguaje) para el&nbsp;webservice y los clientes. No se puede obviar que diferentes herramientas generan diferentes WSDLs a partir de la misma clase Java&#8230;</p>
	<p>Otra desventaja de&nbsp;usar este&nbsp;enfoque es que estamos haciendo al interfaz del&nbsp;webservice depender de la implementación. Adiós abstracción entonces.&nbsp;Si ma&ntilde;ana cambia la implementación es más que posible que deba cambiar el interfaz (WSDL) y, por tanto, también&nbsp;todos los clientes que se hubieran creado. Además&nbsp;habremos&nbsp;perdido el control sobre el dise&ntilde;o del interface del webservice, en realidad la cara de todo servicio web, lo que todo el mundo que va a ver y donde merece la pena emplear tiempo para que sea lo más amigable y comprensible.</p>
	<p><strong>El camino</strong><br />La alternativa que en este tutorial se propone es actuar justo al revés&nbsp;y de forma más natural. Primero se define el interfaz del webservice, es decir, el WSDL, donde se describen las operaciones, el formato de los mensajes, el tipo y protocolo de comunicación. Entonces se&nbsp;generan de forma automática las clases Java que&nbsp;implementan tanto el&nbsp;esqueleto del webservice como sus mensajes. Este método se llama&nbsp;<em><strong>WSDL to Java</strong></em>.</p>
	<p>No sólo es más natural el orden de hacer las cosas, primero el interfaz, luego la implementación. También es mucho más natural y&nbsp;ágil describir los mensajes XML del webservice usando schemas XML&nbsp;en vez de&nbsp;clases Java. Otras ventajas son&nbsp;evitar los posibles&nbsp;efectos colaterales en la interoperabilidad&nbsp;sufridos por la generación automática del WSDL, y no perder el control sobre su dise&ntilde;o.</p>
	<p>En realidad, y como veremos, crear un WSDL no es tan complicado, mientras no vayamos la primera vez en plan comando con un editor de textos básico. Tranquilidad, porque además no hace falta empollarse la especificación del W3C, sólo un buen IDE y tener claros un par de conceptos. No me enrollo más. Allá vamos!</p>
<a id="more-11"></a>
<p><strong>Preliminares<br /></strong>Para seguir este tutorial antes deberias instalar:</p>
	<ul>
<li>
<div><a href="http://java.sun.com/javase/downloads/index.jsp" target="_blank"><font color="#0066cc">JDK</font></a> 1.4 o superior, con la variable de entorno <em>JAVA_HOME</em> configurada.</div>
</li>
	<li>
<div>Eclipse 3.3 + wtp&nbsp;2.0 o superior. Puedes descargar&nbsp;desde <a href="http://download.eclipse.org/webtools/downloads/drops/R2.0/R-2.0-200706260303/" target="_blank">aquí</a>&nbsp;el pack all-in-one.</div>
</li>
	<li>
<div>Axis2 1.2 Standard Binary Distribution.&nbsp;No olvides configurar&nbsp;la variable de entorno AXIS2_HOME. Si necesitas ayuda para instalar Axis2 puedes consultar el artículo anterior <a title="Instalando Axis2" href="http://jcesarperez.blogsome.com/2007/05/14/instalando-axis2/" target="_blank">Instalando Axis2</a>.</div>
</li>
</ul>
	<p><strong>Estructura de un webservice en Axis2<br /></strong>Axis2 utiliza un&nbsp;modelo propio de empaquetamiento para webservices. Este nuevo modelo permite a Axis2&nbsp;el despliegue en caliente y auto-actualización de los webservices de su repositorio. La estructura de este modelo es similar al conocido jar, pero con las siguientes&nbsp;diferencias:</p>
	<ol>
<li>
<div>La extensión para&nbsp;un webservice es&nbsp;<em>aar</em> en vez de jar.</div>
</li>
	<li>
<div>Debe existir un fichero descriptor del webservice llamado <em>services.xml</em>. Este fichero se puede generar automáticamente, así que no es problema.</div>
</li>
	<li>
<div>A nivel raíz existirá una carpeta llamada <em>META-INF</em> que contendrá el citado <em>services.xml</em> y, opcionalmente,&nbsp;el fichero WSDL para devolver en lugar de uno autogenerado por Axis2.</div>
</li>
</ol>
	<p><strong>Descripción del webservice myVirtualShop</strong><br />Es el momento de presentar al webservice que nos acompa&ntilde;ará durante toda&nbsp;esta serie de tutoriales sobre Axis2.</p>
	<p>Imaginemos que tenemos que crear una capa de webservices para ampliar el sistema de ventas por Internet de un negocio que quiere ir más allá de la típica aplicación web de tienda virtual. Esta opción permitirá a los clientes del negocio automatizar su proceso de compras y optimizar su sistema de control de inventario inteligente. Las aplicaciones de los clientes y&nbsp;del negocio van a poder comunicarse de un modo estándar y, lo más importante, independientemente de la tecnología propia de cada una.</p>
	<p>Las operaciones del webservice que vamos a implementar son: obtener el catalogo de productos,&nbsp;búsqueda de productos, hacer un pedido y consultar el estado de un pedido. Las llamaremos <em>getCatalog</em>, <em>search</em>, <em>order</em> y <em>getOrderState</em>, respectivamente.</p>
	<p>En&nbsp;el&nbsp;supuesto modelo de datos de la aplicación,&nbsp;los productos que componen el catálogo formarán parte de una categoria (sólo una) y tendrán una referencia (única), un nombre, una descripción, una disponibilidad&nbsp;y un precio.</p>
	<p><strong>Preparación del entorno de desarrollo<br /></strong>Como entorno de desarrollo voy a utilizar&nbsp;eclipse con&nbsp;sus webtools, y así&nbsp;probar&nbsp;su editor de wsdl y schemas, más&nbsp;el plugin&nbsp;para eclipse, <a href="http://ws.apache.org/axis2/tools/1_2/eclipse/wsdl2java-plugin.html" target="_blank">Code Generator Wizard</a> de Axis2. Los plugins de Axis2 se pueden descargar <a href="http://ws.apache.org/axis2/tools/index.html" target="_blank">aquí</a> y para instalarlos basta con descomprimirlos en la carpeta <em>plugins</em> del eclipse y luego arrancar eclipse.</p>
	<p>Para evitar tener todos los jar del Axis2&nbsp;inundando la vista de nuestro proyecto vamos a crear una libreria de usuario. Abre la pantalla <em>Window/Preferences</em>, selecciona <em>Java/Build Path/User Libraries</em>. Crea una nueva variable de usuario, llamala <em>AXIS2</em>&nbsp;y a&ntilde;ade dentro todos los jar de la carpeta <em>lib</em> de la distribución del Axis2.</p>
	<p><a href="http://jcesarperez.blogsome.com/images/axis2_user_library.jpg"><img title="axis2 user library" height="180" alt="axis2 user library" src="http://jcesarperez.blogsome.com/images/thumb-axis2_user_library.jpg" width="168" border="0" /></a></p>
	<p><strong>Creación del proyecto myVirtualShop</strong><br />Para crear&nbsp;un proyecto de un webservice en Axis2 basta con crear un proyecto Java. Le asignamos un nombre, myVirtualShop por ejemplo, y&nbsp;le a&ntilde;adimos&nbsp;la libreria de usuario que hemos creado para los jar de Axis2. A mi siempre me gusta separar las carpetas de los fuentes y los binarios.</p>
	<p>Ahora creamos las carpetas <em>META-INF</em> y <em>resources</em>. Si fueramos a necesitar alguna otra libreria como hibernate, spring, etc. creariamos también una carpeta <em>lib</em>, copiariamos los jars dentro y&nbsp;los a&ntilde;adiriamos al build path del proyecto.</p>
	<p><img title="proyecto" style="width: 248px; height: 114px" height="114" alt="proyecto" src="http://jcesarperez.blogsome.com/images/proyecto0.jpg" width="248" border="1" /></p>
	<p><strong>Schemas</strong><br />El primer paso del desarrollo del webservice es definir el formato de los mensajes XML de cada operación.&nbsp;Para ello&nbsp;vamos a crear un schema XSD donde se definan los elementos de entrada y&nbsp;salida de las operaciones del webservice. Se podría crear más de un schema, quizás lo recomendable es uno por mensaje, pero por simplificar lo dejaremos en un solo schema.</p>
	<p>Crear un schema no es complicado, sobretodo&nbsp;si se cuenta con un buen editor visual. Es similar a crear arboles,&nbsp;se empieza por definir un&nbsp;elemento&nbsp;del que pueden colgar secuencias de otros elementos y así sucesivamente. Los elementos tienen un nombre y pueden tener atributos. Tanto los atributos&nbsp;como los elementos que serían las hojas del árbol tienen un tipo. Al elemento que sería la raíz del árbol se le&nbsp;denomina global. Una&nbsp;buena práctica es hacer globales los elementos que se vayan a reutilizar, como el elemento <em>Producto</em> al que se hace referencia en las respuestas de las operaciones <em>getCatalog</em> y <em>search</em>.</p>
	<p>El editor XML de las WTP de Eclipse no está mal. Su punto fuerte es la refactorización. Puedes cambiar el nombre, orden y tipo de elementos y atributos sin problemas. Lo que no me ha gustado es que sólo es capaz de mostrar 2 profundidades a la vez en pantalla. Para avanzar en la jerarquía tienes que seleccionar el elemento más profundo (derecha). En general prefiero el <a href="http://www.altova.com/products/xmlspy/xml_editor.html" target="_blank">XMLSpy</a>, pero no es gratis.</p>
	<p>El&nbsp;schema se llamará <em>myVirtualShop.xsd</em>, con <em>http://www.example.org/myVirtualShop/messages</em>&nbsp;como namespace e irá en la carpeta <em>META-INF</em>. Dentro del schema se define un elemento global por cada mensaje.&nbsp;Los mensajes son&nbsp;<em>getCatalogRequest</em>, <em>getCatalogResponse</em>, <em>searchRequest</em>, <em>searchResponse</em>, <em>orderRequest</em>, <em>orderResponse</em>, <em>getOrderStateRequest</em> y <em>getOrderStateResponse</em>. Su formato puede examinarse en las siguientes figuras.</p>
	<p><a href="http://jcesarperez.blogsome.com/images/getCatalogRequest2.jpg"><img title="getCatalogRequest" style="width: 180px; height: 20px" height="20" alt="getCatalogRequest" src="http://jcesarperez.blogsome.com/images/thumb-getCatalogRequest2.jpg" width="180" border="0" /></a><a href="http://jcesarperez.blogsome.com/images/getCatalogResponse.jpg"><img title="getCatalogResponse" height="71" alt="getCatalogResponse" src="http://jcesarperez.blogsome.com/images/thumb-getCatalogResponse.jpg" width="180" border="0" /></a><a href="http://jcesarperez.blogsome.com/images/searchRequest.jpg"><img title="searchRequest" height="103" alt="searchRequest" src="http://jcesarperez.blogsome.com/images/thumb-searchRequest.jpg" width="180" border="0" /></a><a href="http://jcesarperez.blogsome.com/images/searchResponse.jpg"><img title="searchResponse" height="81" alt="searchResponse" src="http://jcesarperez.blogsome.com/images/thumb-searchResponse.jpg" width="180" border="0" /></a><a href="http://jcesarperez.blogsome.com/images/orderRequest.jpg"><img title="orderRequest" height="67" alt="orderRequest" src="http://jcesarperez.blogsome.com/images/thumb-orderRequest.jpg" width="180" border="0" /></a><a href="http://jcesarperez.blogsome.com/images/orderResponse.jpg"><img title="orderResponse" height="76" alt="orderResponse" src="http://jcesarperez.blogsome.com/images/thumb-orderResponse.jpg" width="180" border="0" /></a><a href="http://jcesarperez.blogsome.com/images/getOrderStateRequest.jpg"><img title="getOrderStateRequest" height="20" alt="getOrderStateRequest" src="http://jcesarperez.blogsome.com/images/thumb-getOrderStateRequest.jpg" width="180" border="0" /></a><a href="http://jcesarperez.blogsome.com/images/getOrderStateResponse.jpg"><img title="getOrderStateResponse" height="35" alt="getOrderStateResponse" src="http://jcesarperez.blogsome.com/images/thumb-getOrderStateResponse.jpg" width="180" border="0" /></a></p>
	<p>Unos ejemplos de los XML resultantes: <a href="http://weblogs.javahispano.org/jcesarperez/resource/axis2/getCatalogRequestSample.xml.jpg" target="_blank">1</a>, <a href="http://weblogs.javahispano.org/jcesarperez/resource/axis2/getCatalogResponseSample.xml.jpg" target="_blank">2</a>, <a href="http://weblogs.javahispano.org/jcesarperez/resource/axis2/searchRequestSample.xml.jpg" target="_blank">3</a>, <a href="http://weblogs.javahispano.org/jcesarperez/resource/axis2/searchResponseSample.xml.jpg" target="_blank">4</a>, <a href="http://weblogs.javahispano.org/jcesarperez/resource/axis2/orderRequestSample.xml.jpg" target="_blank">5</a>, <a href="http://weblogs.javahispano.org/jcesarperez/resource/axis2/orderResponseSample.xml.jpg" target="_blank">6</a>, <a href="http://weblogs.javahispano.org/jcesarperez/resource/axis2/getOrderStateRequestSample.xml.jpg" target="_blank">7</a> y <a href="http://weblogs.javahispano.org/jcesarperez/resource/axis2/getOrderStateResponseSample.xml.jpg" target="_blank">8</a>.</p>
	<p>Los elementos <em>Producto</em> y <em>Catalogo</em> se han hecho&nbsp;globales&nbsp;para poder reutilizarse en distintos mensajes. <em>Producto</em> para reutilizarse en&nbsp;<em>getCatalogRequest</em>&nbsp;y&nbsp;<em>searchResponse</em>, y&nbsp;<em>Catalogo</em> por si en un futuro se desea crear una nueva operación que lo use.</p>
	<p><a href="http://weblogs.javahispano.org/jcesarperez/resource/axis2/myVirtualShop.xsd.jpg" target="_blank">Éste</a> es el schema final, copialo a <em>META-INF</em> y refresca el proyecto. Ojo! borra la extensión jpg y dejalo en xsd (lo mismo para los siguientes ficheros, cosas de la administración del blog&#8230;).</p>
	<p><strong>El temido WSDL</strong><br />Ahora&nbsp;vamos a&nbsp;crear el interfaz del webservice, el WSDL. Selecciona <em>File/New/Other/Web Services/WSDL</em>. Colócalo en <em>META-INF</em> y dale un nombre, <em>myVirtualShop.wsdl</em>. Pulsa <em>Next</em>. El target namespace será <em>http://www.example.org/myVirtualShop/wsdl</em>. Lo demás dejalo como está: SOAP como protocolo y la opción document literal. Es decir,&nbsp;va a ser un webservice basado en intercambio de documentos mediante SOAP.</p>
	<p>Ya tenemos delante un esqueleto del WSDL. Echale un ojo&nbsp;a la vista Source y verás los distintos elementos que forman un WSDL:</p>
	<ul>
<li>
<div><strong><em>Service</em></strong>: el servicio en sí. El nombre del servicio y del&nbsp;puerto se usan para formar la url con la que acceder al servicio, también llamada <em>endpoint</em>. Su formato es el siguiente: <em>http://host:puerto/axis2/services/nombre_portType</em>.<br />El atributo location puedes dejarlo como está. El propio Axis se encargará de modificarlo según sea necesario.</div>
</li>
	<li>
<div><strong><em>PortType</em></strong>: es el interfaz donde se definen&nbsp;las operaciones del webservice.</div>
</li>
	<li>
<div><strong><em>Binding</em></strong>: especifica el protocolo concreto, el tipo de webservice y los formatos de las operaciones de un PortType concreto.</div>
</li>
	<li>
<div><strong><em>Message</em></strong>: define&nbsp;los mensajes de&nbsp;cada operación del webservice.</div>
</li>
	<li>
<div><strong><em>Types</em></strong>: es un elemento contenedor para definir los tipos de datos o elementos que serán usados en los mensajes. Las definiciones se hacen con schemas XSD.</div>
</li>
</ul>
	<p>Aunque un buen editor visual te abstrae de muchos de estos detalles&nbsp;es más que&nbsp;recomendable familiarizarse con el código y la sintaxis.</p>
	<p>Lo primero que&nbsp;vamos a&nbsp;hacer es&nbsp;importar dentro del WSDL el schema donde hemos definido&nbsp;previamente los elementos&nbsp;que forman los mensajes. En este punto el editor no funciona muy bien y lo mejor es hacerlo a mano. Desde la vista <em>Source</em> del editor cambia el fichero para que sea igual que este:</p>
	<p class="source-code">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />&lt;wsdl:definitions xmlns:soap=&quot;http://schemas.xmlsoap.org/wsdl/soap/&quot;<br />&nbsp;xmlns:tns=&quot;http://www.example.org/myVirtualShop/wsdl&quot;<br />&nbsp;xmlns:wsdl=&quot;http://schemas.xmlsoap.org/wsdl/&quot;<br />&nbsp;<strong>xmlns:msg=&quot;http://www.example.org/myVirtualShop/messages&quot;</strong><br />&nbsp;xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; name=&quot;myVirtualShop&quot;<br />&nbsp;targetNamespace=&quot;http://www.example.org/myVirtualShop/wsdl&quot;&gt;<br />&nbsp;&nbsp;&nbsp; <strong>&lt;wsdl:types&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsd:schema xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;xsd:import<br />&nbsp;&nbsp;&nbsp;&nbsp;namespace=&quot;http://www.example.org/myVirtualShop/messages&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;schemaLocation=&quot;myVirtualShop.xsd&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/xsd:import&gt;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsd:schema&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/wsdl:types&gt;</strong><br /><em>[&#8230;]</em></p>
	<p>Una vez definidos los tipos podemos usar el editor visual para ir creando las distintas operaciones y mensajes correspondientes. Ve a la vista <em>Design</em> del editor. De izquierda a derecha están representados los elementos <em>service</em>, <em>binding</em> y <em>port type</em>. Verás que ya existe una primera operación genérica.&nbsp;Vamos a cambiarle&nbsp;el nombre&nbsp;por <em>getCatalog</em> y asignar como mensajes de entrada y salida los elementos existentes dentro del proyecto <em>getCatalogRequest</em> y <em>getCatalogResponse</em> respectivamente.</p>
	<p><a href="http://jcesarperez.blogsome.com/images/wsdl0.jpg"><img title="wsdl inicial" height="87" alt="wsdl inicial" src="http://jcesarperez.blogsome.com/images/thumb-wsdl0.jpg" width="180" border="0" /></a></p>
	<p>Para cambiar el nombre de la operación, haz doble click sobre el primer&nbsp;<em>NewOperation</em>. Para asignar el elemento <em>getCatalogRequest</em> haz click derecho sobre el elemento de entrada&nbsp;<em>NewOperation</em> a la derecha de <em>input</em>. Selecciona <em>Set Element/Existing</em>. En <em>Search Scope</em> marca <em>Enclosing Project</em> para ver la lista de elementos disponibles. Selecciona el elemento&nbsp;<em>getCatalogRequest</em> de nuestro schema. Ahora haz lo mismo para la respuesta <em>NewOperationResponse</em>, el elemento que tienes que asignar es, lógicamente,&nbsp;<em>getCatalogResponse</em>.</p>
	<p>Fácil, no? Pues ahora crea el resto de operaciones: <em>search</em>, <em>order</em> y <em>getOrderState</em>, y asignales sus correspondientes mensajes de entrada y salida<em>.</em></p>
	<p>Ojo! Lo cierto es que el editor aún falla bastante. Por ejemplo, al crear una nueva operación creará un schema interno en <em>types</em>&nbsp;para los tipos de los mensajes. Lo podrás ver en la vista Outline. Debes elegir siempre como elementos de los mensajes los del schema <em>myVirtualShop.xsd</em>. Y al terminar el WSDL borra este schema interno que se crea solo y cualquier rastro suyo.</p>
	<p>Finalmente debemos actualizar el contenido del <em>binding</em> con las nuevas operaciones. Para ello haz click derecho sobre el binding y selecciona <em>Generate Binding Content</em>.</p>
	<p>En cualquier momento puedes validar el WSDL haciendo click derecho sobre él en la vista <em>Package Explorer</em> y seleccionando <em>Validate</em>.</p>
	<p><a href="http://weblogs.javahispano.org/jcesarperez/resource/axis2/myVirtualShop.wsdl.jpg" target="_blank">Éste</a> es el WSDL final y como quedaria en el editor visual.</p>
	<p><a href="http://jcesarperez.blogsome.com/images/wsdl_final.jpg"><img title="wsdl final" height="87" alt="wsdl final" src="http://jcesarperez.blogsome.com/images/thumb-wsdl_final.jpg" width="180" border="0" /></a></p>
	<p><strong>WSDL2Java</strong><br />Lo más traumático ya ha pasado. Ahora con el&nbsp;WSDL ya definido vamos a crear&nbsp;las clases del&nbsp;webservice a partir de él. Para ello haremos uso del plugin <a href="http://ws.apache.org/axis2/tools/1_2/eclipse/wsdl2java-plugin.html" target="_blank">Code Generator Wizard</a> de Axis2 que previamente hemos instalado y ejecutaremos el método WSDL2Java.</p>
	<p>Selecciona <em>File/New/Other/Axis2 Wizards/Axis2 Code Generator</em>, elije el wizard para generar código Java a partir de un fichero WSDL e&nbsp;indica la localización del WSDL. A continuación aparecerá la pantalla de opciones. En ella puedes elegir entre generar código para servidor, cliente o ambos, puedes indicar el motor de Databinding a usar y asignar mapeos entre namespaces XML y packages Java. Nosotros vamos a generar código Java para servidor usando <a href="http://ws.apache.org/axis2/1_0/adb/adb-howto.html" target="_blank">adb</a> como motor de Databinding y el fichero descriptor del webservice, <em>services.xml</em>. Para ello haz lo siguiente:</p>
	<ol>
<li>
<div>Selecciona la opción <em>custom</em> para <em>Codegen option</em>.</div>
</li>
	<li>
<div>Indica <em>org.example.myvirtualshop.ws</em> como <em>Custom package name</em>.</div>
</li>
	<li>
<div>Selecciona <em>Generate server side code</em> y <em>Generate a default services.xml</em>.</div>
</li>
	<li>
<div>Indica el nombre de package <em>org.example.myvirtualshop.ws</em> para el namespace <em>http://www.example.org/myVirtualShop/ws</em>.</div>
</li>
	<li>
<div>Indica el nombre de package <em>org.example.myvirtualshop.ws.messages</em> para el namespace <em>http://www.example.org/myVirtualShop/ws/messages</em>.</div>
</li>
</ol>
	<p>La pantalla quedaría así:</p>
	<p><a href="http://jcesarperez.blogsome.com/images/Axis2CodeGenWizard.jpg"><img title="Pantalla Opciones del Axis2 Code Gen" height="180" alt="Pantalla Opciones del Axis2 Code Gen" src="http://jcesarperez.blogsome.com/images/thumb-Axis2CodeGenWizard.jpg" width="162" border="0" /></a></p>
	<p>Para finalizar sólo queda seleccionar el destino del código generado. En la siguiente pantalla indica el proyecto MyVirtualShop. Para ello&nbsp;selecciona&nbsp;la primera opción, <em>Browse and select a project [&#8230;]</em>, e indica el proyecto MyVirtualShop en el&nbsp;diálogo <em>Browse</em>. Pulsa <em>Finish</em> y listo!</p>
	<p>Si refrescas el proyecto podras ver todo lo generado:</p>
	<ol>
<li>
<div>En <em>src</em>, el package <em>org.example.myvirtualshop.ws</em> que contiene las clases <em>MyVirtualShopMessageReceiverInOut</em> y <em>MyVirtualShopSkeleton</em>. Ésta última es la clase skeleton que hay que completar para dotar de funcionalidad al webservice, si le echas un vistazo verás que tiene un método por cada operación. La primera se encarga de recibir y enviar los mensajes de forma transparente.</div>
</li>
	<li>
<div>En <em>src</em>, el package <em>org.example.myvirtualshop.ws.messages</em> con las clases&nbsp;que implementan los elementos XML de los mensajes del webservice según el motor Databinding empleado.</div>
</li>
	<li>
<div>En <em>resources</em>,&nbsp;el fichero descriptor&nbsp;<em>services.xml</em> y los ficheros temporales <em>myVirtualShop.wsdl</em> y&nbsp;<em>xsd0.xsd</em> utilizados durante la generación de código.</div>
</li>
	<li>
<div>En el raíz del proyecto, el script ANT <em>build.xml</em> que usaremos para empaquetar el webservice en un fichero aar.</div>
</li>
</ol>
	<p><strong>Decepciones</strong><br />A más de uno le habrá sorprendido encontrarse con esos sufijos <em>_typeX</em> en los nombres de las clases generadas para los mensajes. Sinceramente a mi también y me parece imperdonable para una versión 1.2. Más aún si tenemos en cuenta que este comportamiento no ocurría en Axis1.</p>
	<p>La herramienta todavía contiene más bugs o defectos que ya estaban solucionados en Axis1. Por ejemplo, no hay manera de que sobreescriba el código generado, tienes que borrar primero, inexplicable también&nbsp;el formato e indentación&nbsp;de la clase skeleton. Además&nbsp;si usas XMLBeans como motor de Databinding ya te aviso que no funciona para todos los WSDLs, al menos yo he tenido problemas con varios.</p>
	<p><strong>Implementación</strong><br />Para poder probar el webservice sin obtener un molesto AxisFault vamos a&nbsp;a&ntilde;adir una clase <em>mock</em> que implemente las operaciones del webservice y en la que delegue la clase skeleton. Ojo! Esto no es más que un prototipo rápido que&nbsp;sería sustituido en un desarrollo real.</p>
	<p>La clase mock es <a href="http://weblogs.javahispano.org/jcesarperez/resource/axis2/MyVirtualShopMock.java.jpg" target="_blank">ésta</a>. Más tonta no puede ser. Crea&nbsp;el nuevo package <em>org.example.myvirtualshop.ws.mock</em> y cópiala dentro.</p>
	<p>Ahora modifica la clase skeleton para que delegue en el mock. El código quedaría así:</p>
	<p class="source-code">import org.example.myvirtualshop.ws.mock.MyVirtualShopMock;<br />/**<br />&nbsp;*&nbsp; MyVirtualShopSkeleton java skeleton for the axisService<br />&nbsp;*/<br />public class MyVirtualShopSkeleton{<br />&nbsp; public org.example.myvirtualshop.ws.messages.GetCatalogResponse getCatalog(org.example.myvirtualshop.ws.messages.GetCatalogRequest getCatalogRequest){<br />&nbsp;&nbsp;&nbsp; MyVirtualShopMock mock = new MyVirtualShopMock();<br />&nbsp;&nbsp;&nbsp; return mock.getCatalog(getCatalogRequest);<br />&nbsp;&nbsp;}<br />&nbsp; public org.example.myvirtualshop.ws.messages.SearchResponse search(org.example.myvirtualshop.ws.messages.SearchRequest searchRequest){<br />&nbsp;&nbsp;&nbsp; MyVirtualShopMock mock = new MyVirtualShopMock();<br />&nbsp;&nbsp;&nbsp; return mock.search(searchRequest);<br />&nbsp; }<br />&nbsp; public org.example.myvirtualshop.ws.messages.OrderResponse order(org.example.myvirtualshop.ws.messages.OrderRequest orderRequest){<br />&nbsp;&nbsp;&nbsp; MyVirtualShopMock mock = new MyVirtualShopMock();<br />&nbsp;&nbsp;&nbsp; return mock.order(orderRequest);<br />&nbsp; }<br />&nbsp; public org.example.myvirtualshop.ws.messages.GetOrderStateResponse getOrderState(org.example.myvirtualshop.ws.messages.GetOrderStateRequest getOrderStateRequest){<br />&nbsp; &nbsp;&nbsp;MyVirtualShopMock mock = new MyVirtualShopMock();<br />&nbsp;&nbsp; &nbsp;return mock.getOrderState(getOrderStateRequest);<br />&nbsp; }<br />}</p>
	<p><strong>Empaquetar y desplegar</strong><br />El desarrollo ya está terminado, sólo falta empaquetar y desplegar. Para empaquetar vamos a usar ANT porque el plugin&nbsp;<a href="http://ws.apache.org/axis2/tools/1_2/eclipse/servicearchiver-plugin.html" target="_blank">Service Archiver</a>&nbsp;de Axis2 deja mucho que desear (y va otra decepción).</p>
	<p>Antes debemos preparar el proyecto. Para ello borra los ficheros temporales ficheros temporales <em>myVirtualShop.wsdl</em> y&nbsp;<em>xsd0.xsd</em> en <em>resources</em> y copia desde <em>META-INF</em> a <em>resources</em> los ficheros <em>myVirtualShop.wsdl y myVirtualShop.xsd</em>. El proyecto quedaría así:</p>
	<p><img style="width: 311px; height: 290px" height="290" src="http://jcesarperez.blogsome.com/images/pre_ant.JPG" width="311" border="1" /></p>
	<p>Para usar ANT debes abrir la vista ANT del Eclipse y arrastrar dentro el fichero <em>build.xml</em>. Haz doble click en el task <em>jar.server</em> y refresca el proyecto cuando termine. El webservice habrá quedado empaquetado en un fichero <em>Services.aar</em> en&nbsp;la carpeta recien creada <em>build/lib</em>. Cámbiale el nombre <em>myVirtualShop.aar</em>.<br />(<strong><em>Actualización 06/08/2007</em></strong>: Si obtienes un error de javac al ejecutar ANT asegurate que en la variable <em>path</em> del sistema se apunta a la carpeta <em>bin</em> del JDK)</p>
	<p>Toca desplegar, tan sólo tienes que copiar el webservice al repositorio de Axis2, en <em>services</em>, y arrancar el servidor con el script <em>axis2server</em> situado en <em>bin</em>. Para comprobarlo abre en un navegador la url <em>http://localhost:8080/axis2/services/</em>&nbsp;y verás el webservice myVirtualShop desplegado junto al Version de Axis2.</p>
	<p><a href="http://jcesarperez.blogsome.com/images/desplegado.jpg"><img title="" height="154" alt="" src="http://jcesarperez.blogsome.com/images/thumb-desplegado.jpg" width="180" border="0" /></a></p>
	<p>Por supuesto todo este proceso de empaquetamiento y despliegue se podría automatizar un poco más con un nuevo task de ANT. También se podría haber ejecutado Axis2 sobre un Tomcat. He preferido dejarlo así por sencillez.</p>
	<p>Bien, pues esto es todo entonces.&nbsp;Si no puedes esperar al siguiente artículo para crear un cliente y probar el webservice, puedes usar alguna herramienta tipo <a href="http://www.altova.com/products/xmlspy/xml_editor.html" target="_blank">XMLSpy</a>, <a href="http://jakarta.apache.org/jmeter/" target="_blank">JMeter</a> o <a href="http://www.soapui.org/" target="_blank">SoapUI</a> que permiten invocar las operaciones de un webservice a partir de su WSDL. Para acceder al WSDL de un servicio Axis basta con a&ntilde;adir el sufijo <em>?wsdl</em> al endpoint del servicio, sería: <em>http://localhost:8080/axis2/services/myVirtualShop?wsdl</em>.</p>
	<p><strong>Conclusiones</strong><br />Me ha quedado un post realmente largo y a priori podría parecer que&nbsp;desarrollar un webservice con&nbsp;WSDL2Java es dificil y complicado, sobretodo si lo comparamos con los&nbsp;últimos Helloworld de Java2WSDL + anotaciones con Netbeans. Pero no sería una comparación justa, aquí se ha desarrollado un webservice con un interfaz relativamente complejo&nbsp;y no un simple Helloworld que devuelve un String.</p>
	<p>Si bien en la actualidad WSDL2Java&nbsp;no es&nbsp;la metodología con mayor apoyo por parte de la industria, en mi opinión es la metodología más adecuada para construir un webservice de complejidad media/alta respetando al máximo la <strong>interoperabilidad</strong>, el&nbsp;principal objetivo&nbsp;de los webservices, y cuidando el desarrollo del interfaz del servicio.</p>
	<p>Si el interfaz de un webservice son los mensajes XML qué mejor forma de definir el formato de un documento XML&nbsp;que con schemas XSD. Construir luego&nbsp;el WSDL puede costar al principio (como todo lo nuevo) pero en realidad es un proceso mecánico. A cambio obtendremos de un modo automático todas las clases Java necesarias para realizar el intercambio de mensajes. &iquest;Merece la pena aprender a construir un WSDL? Para mi sí, sin duda.</p>
]]></content:encoded>
			<wfw:commentRss>http://jcesarperez.blogsome.com/2007/07/24/desarrollar-un-webservice-desde-wsdl-con-axis2/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Scrum and XP from the Trenches: libro gratuito sobre cómo usar Scrum</title>
		<link>http://jcesarperez.blogsome.com/2007/07/18/scrum-and-xp-from-the-trenches-libro-gratuito-sobre-como-usar-scrum/</link>
		<comments>http://jcesarperez.blogsome.com/2007/07/18/scrum-and-xp-from-the-trenches-libro-gratuito-sobre-como-usar-scrum/#comments</comments>
		<pubDate>Wed, 18 Jul 2007 17:39:02 +0000</pubDate>
		<dc:creator>jcesarperez</dc:creator>
		
	<category>ALL</category>
	<category>Metodologia</category>
	<category>Libros</category>
		<guid>http://jcesarperez.blogsome.com/2007/07/18/scrum-and-xp-from-the-trenches-libro-gratuito-sobre-como-usar-scrum/</guid>
		<description><![CDATA[Scrum and XP from the Trenches: libro gratuito sobre cómo usar Scrum]]></description>
			<content:encoded><![CDATA[	<p><img title="Scrum and XP from the Trenches" style="width: 124px; height: 183px" height="183" alt="Scrum and XP from the Trenches" hspace="10" src="http://www.crisp.se/henrik.kniberg/ScrumAndXpFromTheTrenches.jpg" width="124" align="left" vspace="2" border="0" />Scrum and XP from the Trenches es el último&nbsp;libro que he leido. Llevaba un tiempo oyendo hablar de la metodología <a href="http://es.wikipedia.org/wiki/Scrum" target="_blank">Scrum</a> aplicada al desarrollo de software y me apetecia saber más, pero más que un libro teórico lo que estaba buscando era&nbsp;algo práctico y basado en la experiencia. No quería saber qué es Scrum sino cómo sería usarlo en un proyecto real.</p>
	<p>El libro resulta muy ameno, se lee en unos dias, no llega a 200 páginas, y está escrito con un inglés sencillo. Como encima tiene una <a href="http://www.infoq.com/minibooks/scrum-xp-from-the-trenches" target="_blank">versión gratuita en InfoQ</a>&nbsp;(gracias <a href="http://www.crisp.se/henrik.kniberg/" target="_blank">Henrik Kniberg</a>), no se le puede pedir mucho más. Totalmente recomendable.</p>
	<p>Es muy curioso y envidiable ver que fuera de Espa&ntilde;a, tener dias para trabajar desde casa,&nbsp;para autoformación o contar con grandes pizarras y salas donde reunirse no es ciencia-ficción. Y de seguir una metodología ágil ni hablamos&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://jcesarperez.blogsome.com/2007/07/18/scrum-and-xp-from-the-trenches-libro-gratuito-sobre-como-usar-scrum/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Limitar el número de registros devueltos en un SELECT desde JDBC</title>
		<link>http://jcesarperez.blogsome.com/2007/06/11/limitar-el-numero-de-registros-devueltos-en-un-select-desde-jdbc/</link>
		<comments>http://jcesarperez.blogsome.com/2007/06/11/limitar-el-numero-de-registros-devueltos-en-un-select-desde-jdbc/#comments</comments>
		<pubDate>Mon, 11 Jun 2007 08:46:01 +0000</pubDate>
		<dc:creator>jcesarperez</dc:creator>
		
	<category>ALL</category>
	<category>JDBC</category>
	<category>Java</category>
		<guid>http://jcesarperez.blogsome.com/2007/06/11/limitar-el-numero-de-registros-devueltos-en-un-select-desde-jdbc/</guid>
		<description><![CDATA[¿Necesitas limitar el número de registros devueltos en una sentencia SELECT de un modo agnóstico al SGBD empleado?]]></description>
			<content:encoded><![CDATA[	<p>En ocasiones es necesario limitar el número de registros obtenidos mediante una consulta SQL. El problema es que no hay un modo estándar de hacer esto con SQL. Por normal general hay que recurrir a alguna extensión propia de cada SGBD.</p>
	<p>Así, por ejemplo,&nbsp;en Oracle se emplea la pseudo columna <em>rownum</em>.</p>
	<p class="source-code">select * from MI_TABLA where <strong>rownum&lt;=10</strong>;</p>
	<p>En SQL Server, se usa la cláusula especial&nbsp;<em>top</em>.</p>
	<p class="source-code">select <strong>top 10</strong> * from MI_TABLA;</p>
	<p>En MySQL, existe la cláusula <em>limit</em>.</p>
	<p class="source-code">select * from MI_TABLA <strong>limit 10</strong>;</p>
	<p>Pero, &iquest;y si necesitas una solución independiente de la base de datos?</p>
	<p>Entonces no te queda otra que recurrir a JDBC y usar el método <em>setMaxRows</em> del interface <em>java.sql.Statement</em>. Veámoslo!</p>
	<p class="source-code">//Creamos una sentencia SQL<br />Statement select = conexion.createStatement();<br />//Limita el número de registros a devolver por la SELECT<br /><strong>select.setMaxRows(10);</strong><br />//Ejecutamos&nbsp;el select<br />ResultSet resultadoSelect = select.executeQuery(&quot;select * from MI_TABLA&quot; );</p>
	<p>Si quieres usar un <em>PreparedStatement</em> no hay problema. Es&nbsp;el mismo método. Recuerda que&nbsp;<em>PreparedStatement</em> es un interface hijo de <em>Statement</em>. Veámoslo también.</p>
	<p class="source-code">//Creamos un preparedStatement<br />PreparedStatement&nbsp;pSelect = conexión.prepareStatement(&quot;select * from MI_TABLA where MI_CAMPO=?&quot;);<br />//Indicamos el parametro del select (pej un String)<br />pSelect.setString(1, &quot;MI_VALOR&quot;);<br />//Limita el número de registros a devolver por la SELECT<br /><strong>pSelect.setMaxRows(10);</strong><br />//Ejecutamos el select<br />ResultSet resultadoSelect = pSelect.executeQuery();</p>
	<p>Es posible que esta solución sea menos eficiente que la solución nativa del SGBD. Pero eso ya depende del driver JDBC&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://jcesarperez.blogsome.com/2007/06/11/limitar-el-numero-de-registros-devueltos-en-un-select-desde-jdbc/feed/</wfw:commentRss>
	</item>
		<item>
		<title>Instalando Axis2</title>
		<link>http://jcesarperez.blogsome.com/2007/05/14/instalando-axis2/</link>
		<comments>http://jcesarperez.blogsome.com/2007/05/14/instalando-axis2/#comments</comments>
		<pubDate>Mon, 14 May 2007 17:09:09 +0000</pubDate>
		<dc:creator>jcesarperez</dc:creator>
		
	<category>ALL</category>
	<category>SOA</category>
	<category>Axis2</category>
	<category>Tutorial</category>
	<category>Java</category>
		<guid>http://jcesarperez.blogsome.com/2007/05/14/instalando-axis2/</guid>
		<description><![CDATA[Tutorial sobre cómo instalar el motor de webservices Apache Axis2 en español/castellano]]></description>
			<content:encoded><![CDATA[	<p>Axis2 es el nuevo motor de webservices de Apache.&nbsp;Su arquitectura ha sido dise&ntilde;ada desde cero, teniendo en cuenta las lecciones aprendidas con Axis1. Cabe destacar su mejor rendimiento, pero sobretodo su sistema de módulos que&nbsp;permite, de forma sencilla, a&ntilde;adir nuevas funcionalidades y soportar&nbsp;futuras especificaciones sobre&nbsp;webservices.</p>
	<p>Axis2 puede utilizar SOAP 1.1, SOAP 1.2 y REST. Además soporta las especificaciones <a title="External Link" href="http://www.oasis-open.org/committees/download.php/16790/wss-v1.1-spec-os-SOAPMessageSecurity.pdf">WS-Security</a>, <a title="External Link" href="http://xml.coverpages.org/ws-reliablemessaging20030313.pdf">WS-ReliableMessaging</a>, <a title="External Link" href="http://www.w3.org/2002/ws/addr/">WS-Addressing</a>, <a title="External Link" href="http://dev2dev.bea.com/pub/a/2004/03/ws-coordination.html">WS-Coordination</a>&nbsp;y <a href="ftp://www6.software.ibm.com/software/developer/library/WS-AtomicTransaction.pdf">WS-Atomic Transaction</a>.</p>
	<p>Con esto, queda presentado Axis2. Para más información&nbsp;puedes consultar su <a href="http://ws.apache.org/axis2" target="_blank">página web</a>.</p>
	<p><strong>Preliminares</strong><br />Si quieres seguir este tutorial antes debes instalar:</p>
	<ul>
<li>
<div><a href="http://java.sun.com/javase/downloads/index.jsp" target="_blank">JDK</a> 1.4 o superior, con la variable de entorno <em>JAVA_HOME</em> fijada.</div>
</li>
	<li>
<div><a href="http://ant.apache.org/" target="_blank">ANT</a> 1.6.5 o superior. Para ejecutar los <em>samples</em> y generar una distribucion war a partir de la standard. No olvides a&ntilde;adir la carpeta <em>bin</em> al path y fijar la variable <em>ANT_HOME</em>.</div>
</li>
	<li>
<div><a href="http://tomcat.apache.org/" target="_blank">Tomcat</a> 5.X o superior. En realidad servirá cualquier contenedor de servlets.</div>
</li>
</ul>
	<p><strong>Descargar</strong><br />Lo primero es bajarse el Axis2. En la página donde&nbsp;<a href="http://ws.apache.org/axis2/download/1_2/download.cgi" target="_blank">descargar</a> Axis2 se pueden encontrar los siguientes tipos de&nbsp;distribución:</p>
	<ul>
<li>
<div><em>Standard Binary Distribution</em>. Es la versión completa de Axis2. Puede ejecutarse, a diferencia de Axis1, como un&nbsp;servidor independiente o generar una aplicación web para desplegar en un contenedor de servlets. Contiene&nbsp;además las herramientas <em>wsdl2java</em>, <em>java2wsdl</em> y los <em>samples</em>.</div>
</li>
	<li>
<div><em>Source Distribution</em>. Contiene el código fuente y puede generarse una versión ejecutable con Maven.</div>
</li>
	<li>
<div><em>WAR (Web Archive) Distribution</em>. Esta es una versión lista para ser desplegada como una aplicación web en un contenedor de servlets.</div>
</li>
	<li>
<div><em>Documents Distribution</em>. Es un zip con toda la documentación.</div>
</li>
</ul>
	<p>Descargamos la primera opción, Standard Binary Distribution, y se descomprime en una ruta a nuestra elección.<br />A continuación se debe crear&nbsp;la variable de entorno <em>AXIS2_HOME</em> para que apunte a la ruta donde se ha descomprimido Axis2, pej: /opt/axis2</p>
	<p>NOTA: En el momento de realizar este tutorial la última versión de Axis2 es la 1.2, durante el resto del tutorial se supondrá que se está trabajando con esta versión.</p>
	<p><strong>Estructura<br /></strong>Echemos un vistazo al Axis2 que acabamos de instalar y encontraremos la&nbsp;siguiente estructura de&nbsp;carpetas:</p>
	<ul>
<li>
<div><em>bin</em>: contiene scripts para&nbsp;ejecutar Axis2 como un servidor standalone y ejecutar las herramientas <em>wsdl2java</em> y <em>java2wsdl</em>.</div>
</li>
	<li>
<div><em>conf</em>: incluye el fichero de configuración <em>axis2.xml.</em></div>
</li>
	<li>
<div><em>lib</em>: las librerias que usa Axis2.</div>
</li>
	<li>
<div><em>repository</em>: contiene los servicios&nbsp;(webservices)&nbsp;y módulos disponibles.</div>
</li>
	<li>
<div><em>samples</em>: códigos de ejemplo.</div>
</li>
	<li>
<div><em>webapp</em>: contiene la aplicación web de administración de Axis2. Se incluye sólo para la&nbsp;generación de&nbsp;una distribución war de Axis2.</div>
</li>
</ul>
	<p><strong>Modo standalone</strong><br />Axis2 puede ejecutarse de 2 modos, como aplicación web desplegada en&nbsp;un contenedor de servlets o como servidor standalone gracias a un mini servidor web que trae integrado. </p>
	<p>El modo standalone es una novedad respecto a Axis1 y muy útil para el desarrollador en entornos limitados. Usa el script <em>axis2server</em> de la carpeta <em>bin</em> para arrancar el servidor de Axis2. Abre la página <a href="http://localhost:8080/axis2/services" target="_blank">http://localhost:8080/axis2/services</a> para comprobar que Axis2 se ha iniciado correctamente. Podras ver el único webservice desplegado, llamado Version, y obtener su WSDL (<a href="http://jcesarperez.blogsome.com/images/axis2.standalone.jpg" target="_blank">ver figura 1</a>).</p>
	<p>Por defecto, el servidor standalone de Axis2 usa el puerto tcp 8080. Si quieres, puedes&nbsp;cambiarlo en el fichero de configuración&nbsp;<em>axis2.xml</em> de la carpeta <em>conf</em>.</p>
	<p class="source-code">&lt;transportReceiver name=&quot;http&quot; class=&quot;org.apache.axis2.transport.http.SimpleHTTPServer&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;parameter name=&quot;port&quot;&gt;6060&lt;/parameter&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>[&#8230;]</em><br />&lt;/transportReceiver&gt;</p>
	<p>Si usas JDK6 y tienes problemas, debes copiar el <em>stax-api.jar</em> de la carpeta <em>lib</em> de Axis2 a la carpeta <em>lib/endorsed</em> del&nbsp;JRE o <em>common/endorsed</em> del Tomcat si vas&nbsp;a usar&nbsp;Axis2 en Tomcat.</p>
	<p><strong>Despliegue en caliente de webservices</strong><br />Una&nbsp;de las novedades más importantes de Axis2 es la posibilidad de desplegar en caliente webservices. Para ello basta con copiar el webservice al repositorio,&nbsp;carpeta <em>services</em>. Adios al AdminClient de Axis1!</p>
	<p>El modelo de despliegue de Axis2, similar al nuevo modelo J2EE,&nbsp;define un formato para empaquetar los webservices. Un fichero .aar (en realidad es un jar) que contendrá los ficheros class, jar y recursos del webservice más un fichero de configuración dentro de la carpeta <em>META-INF</em> llamado <em>services.xml</em>.</p>
	<p>&iquest;Vemos un ejemplo?</p>
	<ol>
<li>
<div>Abre una consola y colocate en la carpeta <em>samples/pojo</em> de Axis2.</div>
</li>
	<li>
<div>Ejecuta: <em>ant</em>. Si no funciona correctamente revisa que el path contiene la carpeta bin de ant y revisa también las variables de entorno JAVA_HOME, AXIS2_HOME y ANT_HOME.</div>
</li>
	<li>
<div>Se habrá creado una carpeta <em>build</em> y dentro el fichero <em>AddressBookService.aar</em>.&nbsp;En realidad es&nbsp;un jar, así que puedes abrirlo con un simple descompresor. Dentro están las clases del webservice y el fichero de configuración <em>services.xml</em> que define el nombre, ámbito, receptores de mensajes y el nombre de la clase principal del servicio. Es muy sencillo, lo veremos en detalle cuando&nbsp;veamos cómo desarrollar webservices.</div>
</li>
	<p class="source-code">&lt;service name=&quot;AddressBookService&quot; scope=&quot;application&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;description&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POJO: AddressBook Service<br />&nbsp;&nbsp;&nbsp; &lt;/description&gt;<br />&nbsp;&nbsp;&nbsp; &lt;messageReceivers&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;messageReceiver mep=&quot;http://www.w3.org/2004/08/wsdl/in-only&quot; &nbsp; class=&quot;org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;messageReceiver mep=&quot;http://www.w3.org/2004/08/wsdl/in-out&quot; &nbsp; class=&quot;org.apache.axis2.rpc.receivers.RPCMessageReceiver&quot;/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/messageReceivers&gt;<br />&nbsp;&nbsp;&nbsp; &lt;parameter name=&quot;ServiceClass&quot; locked=&quot;false&quot;&gt;sample.addressbook.service.AddressBookService&lt;/parameter&gt;<br />&lt;/service&gt;</p>
	<li>
<div>Copia el fichero&nbsp;<em>AddressBookService.aar</em>&nbsp;a la carpeta <em>repository/services</em> de Axis2 y ya está!</div>
</li>
	<li>
<div>Abre de nuevo <a href="http://localhost:8080/axis2/services" target="_blank">http://localhost:8080/axis2/services</a>&nbsp;en un navegador y verás como el servicio AddressBookService se ha desplegado sin tener que reiniciar el servidor (<a href="http://jcesarperez.blogsome.com/images/axis2.hot_deployment.jpg" target="_blank">ver figura 2</a>).</div>
</li>
</ol>
	<p>Este nuevo modelo de despliegue permite también la actualización en caliente de un webservice (aunque por defecto está desactivada). Las características de despliegue y actualización en caliente pueden configurarse en el fichero <em>axis2.xml</em>.</p>
	<p class="source-code">&lt;axisconfig name=&quot;AxisJava2.0&quot;&gt;<br />&nbsp;&nbsp;&nbsp; &lt;parameter name=&quot;hotdeployment&quot;&gt;true&lt;/parameter&gt;<br />&nbsp;&nbsp;&nbsp; &lt;parameter name=&quot;hotupdate&quot;&gt;false&lt;/parameter&gt;<br />&nbsp;&nbsp;&nbsp; <em>[&#8230;]</em><br />&lt;/axisconfig&gt;</p>
	<p><strong>Modo aplicación web</strong><br />Aunque el modo standalone es muy útil, lo normal es distribuir Axis2 como una aplicación web&nbsp;para usar toda la potencia y funcionalidad de nuestro contenedor de servlets favorito.</p>
	<p>Veamos cómo generar un Axis2 war:</p>
	<ol>
<li>
<div>Abre una consola y colocate en la carpeta <em>webapp</em> de Axis2.</div>
</li>
	<li>
<div>Ejecuta: <em>ant</em>.</div>
</li>
	<li>
<div>Se habrá generado el fichero <em>axis2.war</em> dentro de una nueva carpeta <em>dist</em>&nbsp;en Axis2. Esta distribución contiene el fichero de configuración <em>axis2.xml</em> (carpeta <em>conf</em>) y los webservices (<em>services</em>)&nbsp;y módulos (<em>modules</em>) del repositorio de Axis2 en el momento de ser generada.</div>
</li>
</ol>
	<p>Por supuesto, siempre está la opción de bajarte la distribución WAR directamente.</p>
	<p>La distribución web de Axis2 contiene una aplicación de administración. Vamos a verla. Copia el <em>axis2.war</em> generado a la carpeta <em>webapps</em> del Tomcat. Arranca el Tomcat y abre <em>http://&lt;host&gt;:&lt;port&gt;/axis2</em> en un navegador (<a href="http://ws.apache.org/axis2/1_2/images/clip_image006.jpg" target="_blank">ver figura 3</a>).</p>
	<p>Puedes listar los servicios disponibles, validar el estado y administrar Axis2. El usuario es admin/axis2 (puede&nbsp;modificarse en <em>axis2.xml</em>). Con él puedes gestionar los servicios y módulos existentes, además de subir nuevos servicios que serán desplegados automáticamente gracias al despliegue en caliente de Axis2.</p>
	<p>Hay que tener en cuenta que las modificaciones que hagamos se perderan con el reinicio del Tomcat o del Axis2.&nbsp;Para que los cambios en la&nbsp;configuración perduren deben hacerse directamente en el fichero <em>axis2.xml</em>. Por eso, si se va a estar &quot;tocando&quot; la configuración o los servicios lo mejor será descomprimir el <em>axis2.war</em> en <em>webapps/axis2</em> y borrar el <em>axis2.war</em> de <em>webapps</em>.</p>
	<p>Hasta aquí, esto es todo. Sé que me dejo muchas cosas, como módulos, desarrollo de servicios, clientes, handlers, seguridad, etc. Lo veremos poco a poco, el siguiente tema será cómo desarrollar un webservice desde WSDL.</p>
]]></content:encoded>
			<wfw:commentRss>http://jcesarperez.blogsome.com/2007/05/14/instalando-axis2/feed/</wfw:commentRss>
	</item>
	</channel>
</rss>
