martes, 9 de noviembre de 2010

Integración Java EE 6 con .NET 2010

Despues de mucho tiempo he decidido volver a escribir en este Blog, por cuestiones de tiempo muerto en el trabajo. En esta ocasion me toco hacer algo para la facultad, que se ve complicado pero como dice el dicho "Perro que ladra no muerde". El objetivo en si es poder realizar un servicio desde una plataforma X y poder consumirlo desde otra plataforma mediante alguna tecnologia de integracion, las tecnologias que use en este caso son Java (en su verision 6) y .NET(2010).

Las herramientas que use fueron

- Visual Studio 2010
- Eclipse Helios version J2EE
- JBoss AS 6 M5

Por una cuestion de curiosidad, la plataforma que va a exponer el servicio es la .NET, ya que en general uso mas java y esto es mas conocido por mi. La tecnologia de integracion que use fue WebService y para desarrollar realice los siguientes pasos :

Servicio

Abrimos el Visual Studio 2010 y creamos un Web Site de la siguiente manera :

- File > New > Web Site.
- En el cuadro de dialogo que nos aparece seleccionamos el lenguaje Visual C#, marcamos laversion del framework desde la 3.5 en adelante y buscamos el template que digaWFC Service y le ponemos un nombre, en este caso le puse "HelloService".
- Una vez creada la plantilla vamos a tocar tres archivos, dos de ellos se encuentra en la carpeta "App_Code" “IService.cs” (el contrato de l servicio, esto se utiliza para que ambas partes conozcan el servicio a exponer) “Service.cs” (es la implementacion del IService) y el ultimo archivos es el “Web.config”
- IService.cs tiene dos atributos que hay que definirle para indicar que estamos estableciendo un contrato de servicio

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

[ServiceContract(Namespace="http://www.mydomain.com/integration")]
public interface IService
{

[OperationContract]
string greeting(string name);

}
“ServiceContract” definido a nivel de clase indica el contrato junto a con su Namespace, este no es necesario ponerlo, pero si es de buena practica establecer un Namespace para nuestro servicio, ya que de lo contrario nos pondra un namespace por defecto
“OperationContract” define, como su nombre nos indica, la operacion que vamos a exponer, indicando tipo de retorno, nombre de la operacion y parametros, tambien se pueden, en este caso haremos un servicio para hacer un hello world, bien sencillo.
- Service.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

public class Service : IService
{

public string greeting(string name)
{
return "Hello " + name;
}
}
Hasta aquí nada del otro mundo, una simple interfaz y su implementacion, vayamos a configurar un poco mas el servicio, para esto abriremos el ultimo archivo Web.config con la herramiente que nos provee el Visual Studio WFC Service Configuration Tool, para eso nos vamos al menu Tool > WFC Service Configuration Tool, nos aparece una ventana, la cual haremos File > Open > Config File o en su defecto CTRL + O, buscamos el archivo Web.config de nuestro Web Site y nos tiene que aparcer un cuadro como este



Como ven ya nos aparece nuestro service ya creado, lo unico que tendremos que hacer es cambiar la configuracion del Service, para eso desplegamos Services > Service > Endpoints y seleccionamos el primer Endpoint, modifcamos la propiedad que dice Binding a basicHttpBinding y nos fijamos que la propiedad Contract se Iservce.

Por ultimo para terminar hay que configurar el Cliente, para ellos nos paramos en el nodo Client y desde el panel de Tasks elegimos Create New Client y nos aparecerá un wizzard para crear el cliente como este:



Elegimos la opcion From service config, ponemos Browse y buscamos nuestro archivo Web.config y le damos Next



Nos aseguramos que diga basicHttpBinding y le damos nuevamente Next y por ultimo escribimos un nombre que identifique a nuestro Cliente



Le damos una vez mas Next y por ultimo presionamos Finish eso seria todo para configurar nuestro servicio. Cerramos el WFC Service Configuration Tool y simplemente para hacerlo correr presionamos CTRL+F5, lo cual nos mostrara una pagina como la siguiente:



Esto nos muestra que el servicio esta corriendo, lo unico que nos interesa de aca es la direccion del descriptor, en mi caso

http://localhost:1073/HelloService/Service.svc?wsdl

la guardermos para crear el cliente en java.

Cliente

Bien, ya tenemos el servicio creado, resta hacer nuestro cliente por el lado de Java, aca la magia esta en que Eclipse cuenta con un wizzard para crear Clientes Web Services, lo unico que necesitamos suministrarle al Wizzard es lo que todos suponemos, el WSDL, primero antes que nada necesitamos crear un “Java Project” para eso hacemos File > New > Java Project y seguimos el wizzard, ponemos nombre del project “HelloClient” le damos finish y listo.

Una vez creado el proyecto hacemos boton derecho sobre el project recien creado New > Other del menu buscamos el nodo que diga Web Services y dentro de él buscamosWeb Services Client y le damos Next, ahora nos aparecio el Wizzard para el cliente


Como ven, no es muy complicado, simplemente ponemos la direccion del WSDL en el Service definition, como client Java Proxy y en Configuration tenemos que asegurarnos que el runtime sea el JBoss v5.0 (aunque diga v5.0 esta apuntando a mi JBoss 6.0) y el Web service runtime sea Apache Axis, eso es todo, presionamos Finish y se nos crean unas clases dentro de nuestro proyecto. Si quieren pueden chusmear todo lo que creo, no voy a entrar en detalle, simplemente voy a nombrar lo que necesitamos, si se fijan la clase IServiceProxy contiene un metodo que coincide exactamente con el contrato definido en el servicio, bastara con crear una clase con un main y escribir algo del estilo

try {
IServiceProxy proxy = new IServiceProxy();
String result = proxy.greeting(“SnAkEpIt”);
System.out.println(result);
} catch(Exception e) {
e.printStackTrace();
}

y listo, con eso integramos dos aplicaciones en lenguajes distintos.

Cualquier problema que hayan tenido o cualquier error que hayan detectado comentenlo, yo fue probando esto paso a paso a medida que iba escribiendo este tutorial y funciona bien.