A cada uno le pica la paja que se le mete por el culo, no el resto del pajar.
Gonzo, El Sentido De La Vida

Eclipse – Garbage Collector

Estos días me estoy enfrentando a un trabajo con un uso abusivo de memoria (en mi opinión muy innecesario), así que he recordado que cuando era joven y utilizaba el Intelligent Idea en otro trabajo de este estilo, la opción de invocar al colector de basura de la JVM me resultaba muy útil, porque la alternativa era reiniciar constantemente mi IDE.

Por defecto no puedes hacerlo en Eclipse, debes ir a Preferences > General y activar el check de “Show heap status”.

Relacionado, voy a echar un ojo al Memory Analyzer de Eclipse.

Eclipse – Atajos de teclado muy útiles

Me llama la atención que la gente no conoce o no utiliza algunos atajos de teclado increíblemente útiles dentro del editor del Eclipse. Por eso mientras la Toñi prueba lo que acabo de arreglar, os cuento unos pocos.

Al editar ficheros

  • Básicas, copiar (Ctrl + C), cortar (Ctrl + X), pegar (Ctrl + V), deshacer (Ctrl + Z) y rehacer (Ctrl + Y). Están son un estándard en cualquier editor de textos.
  • Organizar las importaciones, Ctrl + Mayus + O. Nos organiza automáticamente las importaciones de clases dentro de la clase que estamos editando. Es decir, añade todas las importaciones necesarias y elimina las innecesarias. Muy útil especialmente cuando cortas y pegas código.
  • Buscar siguiente, Ctrl + K; Buscar anterior Ctrl + Mayus + K. Agiliza mucho la búsqueda de cadenas de texto dentro del mismo archivo, y además te ahorras el cuadro de diálogo de Buscar.
  • Resaltar clase / variable, doble click en el nombre de una clase / variable. Resalta (en gris) el nombre de la clase o variable en el texto para localizar rápidamente dónde se utiliza.
  • Comentar / Descomentar, Ctrl + Mayús + C. Comenta o descomenta la línea o bloque de líneas seleccionadas.
  • Eliminar línea, Ctrl + D. Elimina la línea o bloque de líneas seleccionadas.
  • Subir / Bajar línea, Alt + Flecha arriba o Alt + Flecha abajo.

Navegación

  • Abrir la declaración, Ctrl + Click. Abre la delcaración del método, clase o variable pinchado, aunque esté en otra clase o en otro paquete.
  • Abrir una clase, Ctrl + Mayus + T; Abrir un recurso Ctrl + Mayus + R. Abre un cuadro de diáologo para buscar una clase o recurso por su nombre.
  • Ver clase en…, Ctrl + Mayus + W. Para ver la clase en la vista de Outline, o Explorador de paquetes, o Navegador o Propiedades.
  • Buscar en el workspace, Ctrl + H. Abre el diálogo de búsqueda dentro del workspace.

Seguro que hay otros tan útiles o más como estos … Te sabes alguno ?

Eclipse Ganymede

Ya lo decía Carlos Jesús, el Eclipse Ganymede ya está aquí. Vamos, llegó en Junio pero es que en este negocio no puedes estar a la última en todo.

Entre las novedades a destacar, Cola, que nos permite editar ficheros de manera compartida en tiempo real. Fascinante. Un video de su desarrollador mejor que mil palabras mías.

Fuentes :

Web Services – Primeros pasos con Eclipse – Generar Cliente Servicio Web

Ya hemos publicado nuestro servicio web en un servidor. Ahora queremos generar un cliente que consuma este servicio.

Para ello utilizaremos las mismas herramientas descritas en la entrada sobre la generación del servicio web, y el fichero descriptor del contrato que se generó, HolaMundo.wsdl.

Generamos el cliente Servicio Web

Proyecto holamundoWSClienteNormalmente el cliente y el servidor estarán en distintas máquinas. Por eso crearemos un nuevo proyecto web dinámico, holamundoWSCliente. Introducimos las librerías que necesitamos y el fichero del contrato del servicio, HolaMundo.wsdl (yo lo meteré en una carpeta "doc").

Nos situamos sobre el fichero descriptor del contrato (HolaMundo.wsdl) y seleccionamos "Botón Derecho > Web Services > Generate Client". 

Se nos genera automáticamente las siguientes clases dentro del mismo paquete (es.lycka.holamundoWS.webservices.impl) que la implementación del servicio (HolaMundoImpl):

  • HolaMundoImpl
  • HolaMundoImplProxy
  • HolaMundoImplService
  • HolaMundoImplServiceLocator
  • HolaMundoImplSoapBindingStub

Consumir el servicio web

Generamos una clase cliente de este servicio web que acabamos de crear. Por ejemplo en un nuevo paquete es.lycka.holamundoWS.clientes creamos una clase HolaMundoCliente. Esta clase será muy simple :

package es.lycka.holamundoWS.clientes;

import es.lycka.holamundoWS.webservices.impl.HolaMundoImpl;

import es.lycka.holamundoWS.webservices.impl.HolaMundoImplServiceLocator;

public class HolaMundoCliente {

      public static void main(String[] args) {

            try {

                  HolaMundoImplServiceLocator holaMundoWSServiceLocator = new HolaMundoImplServiceLocator ();

                  HolaMundoImpl holaMundoWS = holaMundoWSServiceLocator.getHolaMundoImpl();

                  String resultado = holaMundoWS.getSaludoLycka("Jero");

                  System.out.println("resultado: " +resultado);

            } catch (Exception e) {

                  e.printStackTrace();

            }

      }

} 

Ejecutamos esta clase (con el servidor iniciado donde esté desplegado el servicio, y con conectividad entre las máquinas cliente y servidor) y en la consola deberíamos de ver :

resultado: Lycka te saluda, Jero.

Es tan bonito lo simple !

Ver también

Web Services – Primeros pasos con Eclipse – Generar Servicio Web

Herramientas necesarias

  • JDK. En esta demo utilizaré la 1.5
  • IDE Desarrollo. En esta demo utilizaré el Eclipse del MEC (Profiles > Public Profiles > Web (con 'W' mayúscula) > Eclipse+J2EE+WebTools[MEC]) de las descargas de yoxos. Este perfil ya contiene las herramientas necesarias para trabajar con los servicios web. La distribución "europa" del eclipse también nos vale.
  • Servidor de aplicaciones. En esta demo utilizaré Tomcat 5.5
  • Librerías para la aplicación web.
    • axis.jar
    • commons-discovery.jar
    • jaxrpc.jar
    • saaj.jar
    • wsdl4j.jar

Creación de los objetos de negocio

Los servicios web son en resumidas cuentas objetos de negocio reutilizables y compartidos.

Por tanto, nos creamos nuestro nuevo proyecto web dinámico, holamundoWS.

Lo primero que debemos crear es un interfaz para el servicio web con los métodos de negocio (es.lycka.holamundoWS.webservices.HolaMundo) y una clase que implemente dicho interfaz (es.lycka.holamundoWS.webservices.impl.HolaMundoImpl). En el ejemplo tendremos un método de negocio, getSaludoLycka.

El código para el interfaz, HolaMundo es :

package es.lycka.holamundoWS.webservices;

import java.rmi.Remote;

import java.rmi.RemoteException;

public interface HolaMundo extends Remote {

      public String getSaludoLycka (String nombre) throws RemoteException;

} 

El código para la implementación, HolaMundoImpl es :

package es.lycka.holamundoWS.webservices.impl;

import java.rmi.RemoteException;

import es.lycka.holamundoWS.webservices.HolaMundo;

public class HolaMundoImpl implements HolaMundo {

      public String getSaludoLycka(String nombre) throws RemoteException {

            return "Lycka te saluda, " + nombre + ".";

      }

} 

Generación del Contrato del Servicio (fichero wsdl) y Publicación del servicio

Con los plugins del Eclipse resulta muy simple.

Proyecto holamundoWSSobre la interfaz del servicio, HolaMundo, y seleccionamos "Pulsamos Botón Derecho del ratón > Web Services > Generate Web Services". Introducimos la ruta de la implementación de la interfaz (Service Implementation). Se nos da la opción qué queremos hacer con el servicio (develop, assamble, deploy, install, start, test) y con el cliente; de momento elegiremos iniciar el servicio (start) y no generar el cliente.

Pulsamos "Next".

En esta pantalla podemos seleccionar los métodos que publicaremos en el servicio web, y el nombre del fichero wsdl. Por comodidad lo renombraré a HolaMundo.wsdl.

Se nos genera, entre otros ficheros, el descriptor del contrato de servicio (Web Content > wsdl > HolaMundo.wsdl)

<?xml version="1.0" encoding="UTF-8"?>

<wsdl:definitions targetNamespace="http://impl.webservices.holamundoWS.lycka.es" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://impl.webservices.holamundoWS.lycka.es" xmlns:intf="http://impl.webservices.holamundoWS.lycka.es" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<!–WSDL created by Apache Axis version: 1.4

Built on Apr 22, 2006 (06:55:48 PDT)–>

 <wsdl:types>

  <schema elementFormDefault="qualified" targetNamespace="http://impl.webservices.holamundoWS.lycka.es" xmlns="http://www.w3.org/2001/XMLSchema">

   <element name="getSaludoLycka">

    <complexType>

     <sequence>

      <element name="nombre" type="xsd:string"/>

     </sequence>

    </complexType>

   </element>

   <element name="getSaludoLyckaResponse">

    <complexType>

     <sequence>

      <element name="getSaludoLyckaReturn" type="xsd:string"/>

     </sequence>

    </complexType>

   </element>

  </schema>

 </wsdl:types>

   <wsdl:message name="getSaludoLyckaResponse">

      <wsdl:part element="impl:getSaludoLyckaResponse" name="parameters"/>

   </wsdl:message>

   <wsdl:message name="getSaludoLyckaRequest">

      <wsdl:part element="impl:getSaludoLycka" name="parameters"/>

   </wsdl:message>

   <wsdl:portType name="HolaMundoImpl">

      <wsdl:operation name="getSaludoLycka">

         <wsdl:input message="impl:getSaludoLyckaRequest" name="getSaludoLyckaRequest"/>

         <wsdl:output message="impl:getSaludoLyckaResponse" name="getSaludoLyckaResponse"/>

      </wsdl:operation>

   </wsdl:portType>

   <wsdl:binding name="HolaMundoImplSoapBinding" type="impl:HolaMundoImpl">

      <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

      <wsdl:operation name="getSaludoLycka">

         <wsdlsoap:operation soapAction=""/>

         <wsdl:input name="getSaludoLyckaRequest">

            <wsdlsoap:body use="literal"/>

         </wsdl:input>

         <wsdl:output name="getSaludoLyckaResponse">

            <wsdlsoap:body use="literal"/>

         </wsdl:output>

      </wsdl:operation>

   </wsdl:binding>

   <wsdl:service name="HolaMundoImplService">

      <wsdl:port binding="impl:HolaMundoImplSoapBinding" name="HolaMundoImpl">

         <wsdlsoap:address location="http://localhost:8080/holamundoWS/services/HolaMundoImpl"/>

      </wsdl:port>

   </wsdl:service>

</wsdl:definitions> 

Testear el servicio web

Comprobemos que vamos bien, es decir, que el servicio se ha generado correctamente y está desplegado y disponible en nuestros servidor de aplicaciones. Nos situamos sobre el fichero descriptor del contrato (HolaMundo.wsdl) y seleccionamos "Botón Derecho > Web Services > Test with Web Services Explorer". 

Explorador de Servicios WebEn la pantalla que se nos abre, Explorador de Servicios Web, podemos navegar entre los distintos servicios publicados y sus métodos. Para probar nuestro método, getSaludoLycka, pulsamos sobre su enlace y le introducimos un nombre. Yo le introduciré "Jero". Y pulsamos en "Go".

En la ventana de status podemos ver los mensajes SOAP que nos ha generado la acción, tanto el que se enviaría del cliente al servidor como el resultado que envía el servidor al cliente. Y efectivamente en este último viaja el saludo que nos devuelve Lycka, "Lycka te saluda, Jero."

Dónde está desplegado el servicio ?

Un detalle importante que no he comentado hasta ahora es cómo sabrá el cliente dónde está desplegado el servicio ?

El contrato del servicio lo especifica (por defecto pone localhost:8080). Para nuestras pruebas funcionará si el cliente se ejecuta en la misma máquina que el servidor, pero de no ser así deberemos sustituir localhost:8080 por el nombre de la máquina servidor y el puerto por el que atienda.

<wsdlsoap:address location="http://localhost:8080/holamundoWS/services/HolaMundoImpl"/>

Ver también

Comenta