Instalar web service Axis2 en linux y tomcat

Instalar web service Axis2 en Linux y Tomcat

Como ya lo dije en un anterior articulo  http://carlosarturocastano.blogspot.com/2011/03/java-net-joombla-apache.html, mi pensamiento es que las empresas deben ser coherentes con sus desarrollo en sistemas , dado que existe una gran tendencia en nuestro  medio por desarrollar en java , pienso es coherente con esta idea tener  todas las herramientas que se puedan en este lenguaje de programación , pues es mas fácil desarrollar y fortalecerse en una sola cosa que en en un montón de retazos tecnológicos , siendo por demás mas fácil de darle mantenimiento a cualquier parte del sistema.
No estoy diciendo con esto que se debe se debe dejar de lado otras tecnologias que presta unos servicios  mejores u optimizados, sino que en lo posible ser lo mas coherente posible con los desarrollos y tecnologias afines.

Para no dorar más la píldora , y siendo consecuente con lo expresado arriba , decidi usar como web service a Axis2 (WS) , es está es una herramienta del proyecto APACHE-JAKARTA, ver línk en http://tomcat.apache.org/.

En resumidas cuentas un servidor WS , sirve como una caja negra para enlazar dos aplicaciones que en general no tiene que saber absolutamente nada , la una de la otra , simplemente una entrega unos datos al WS (webservice) , este los procesa y se los entrega al otro lado de la "caja negra" WS, este mecanismo sencillo pero poderoso , permite que aplicaciones efectuadas en distintas plataformas tecnologicas , incluyendo sistemas operativos, lenguajes y bases de datos se pueden comunicar con un esfuerzo relativamente bajo, ya que en ambos extremos del WS , "caja negra" , cada uno de los participantes (servidor ,aqui se toma como el proveedor del servicio,  y cliente que consume este servicio) , sigue haciendo las cosas como las viene haciendo hasta ahora , preocupandose solamente de instalar en ambos lados  una estructura sencilla dictada por el WS , y uno o dos programas de utilidades del WS , que facilitan la labor.

La operación el el WS (webservice) , es hacer que los datos que le llegan desde el servidor (generador del serrvivio) , se conviertan en un archivo estandar de etiquetas XML , para que puedan ser leídos con cualquier directamente o traducidos mediante un parser que maneje este formato.

Sin embargo existen utilidades con wsdl2java, que toma un documento WDSL (conformado por etiquertas XML) y desde  este implementa el servicio,   que hacen este tratamiento y evitan que tengamos que  manipular esta información en crudo , cosa que aunque no es complicada , no es el objeto del uso del WS en si mismo.
Existe clientes del WS en muchos lenguajes de programación por ejemplo php, perl, .net, jsp, java, c, c++, c#  , etc.

Como lo dije anteriormente tengo inclinación por hacer de mis sistemas un todo coherente en java para tal efecto vamos instalar Tomcat en un contendedor de aplicaciones en JSP y Servlet.

De manera  general implementar del Tomcat y el Axis2 es tan simple como descargar y desempaquetar un programa , que en Linux que es el que nos ocupa se hace a través del comado tar,  basicamente alli no hay mucho que saber , y de hecho eso es lo que se espera , la parametrización de ambos tampoco reviste mayor complejidad para sus funciones básica que en mis experiencia con ambos me ha servido para todo, contadas muy pocas excepciones.

Vamos a usar a Centos 7, pero lo dicho aquí aplica en forma similar para otras versiones de linux , casi sin ningun cambio (Ubuntu y EC2 de amazon, que caminan sin ningún inconveniente como lo he comprobado).

La receta es la siguiente.

1. descargar la versión binaria Tomcat (la última versión es la 9.2)desde el sitio http://tomcat.apache.org/
    la que que esta en forma tar  (tar.gz) , el gz al fina nos dice que es un archivo empaquetado y comprimido o en formato zip.
2. copiar el archivo que se descargó desde el sitio de Tomcat en el directorio /usr/local de su sistema linux, una aclaración aunque esto no es indispensable ya que el sistema corre desde cualquier carpeta que se instale, el directorio /usr/local conjuntamente con /opt son por así decirlo los directorios por defecto que recomiendan, ya que muchas de las configuración, manuales , ejemplos etc , se refieren a ellos , además es muy recomendable cuando se instale el Linux como tal , crear una partición aparte específicamente para /usr/local o /opt para poder  tratarla como una unidad independiente a la hora de hacer respaldo de la información.
3. Una vez se copia el archivo descargado en /usr/local (a parti de ahora yo uso /usr/local pero es similar si desea usar /opt), proceder a descomprimirlo con el comando tar o unzip.
    si optó por la versión 9.0  (la última a la hora de escribir este articulo) , deberuía tener un archivo aproximadamente igual a apache-tomcat-9.0.0.tar.gz , descomprimirlo con tar zxvfPp asi:

  tar zxvfPp  apache-tomcat-9.0.0.tar.gz.

Esta instrucción desempaqueta  el archivo lo coloca en el lugar adecuado y mantiene los permisos originales.
crea una carpeta con el mismo nombre del archivo que se esta procesando, por facilidad personal suelo modificar este nombre llamarlo simplemente tomcat  con el siguiente comando

  mv apache-tomcat-7.0.20 tomcat

Ahora es importante que el servidor se inicialice una vez , el sistema arranque de forma automática, para tal efecto debemos usar  2 script que el Tomcat posee , uno para iniciar y otro para parar , ambos se encuentran
en la carpeta /usr/local/tomcat/bin (asumiendo que se renombro el apache-tomcat como lo indique anteriormente, de lo contrario buscar en esta carpeta , los dos archivos en cuestión son /usr/local/tomcat/bin/starup.sh y /usr/local/tomcat/bin/shutdown.sh para iniciar y apagar el servidor respectivamente,
debemos instalar la invocación del llamado automático del comando startup.sh , colocar comando en el punto de boot que en linux /etc/bashrc


Debemos modificar este archivo incluyendo la inicializacón del tomcat en él, cualquier editor de texto puede servirnos , emacs, joe, vi etc


emacs /etc/bashrc


incluir al final


/usr/local/tomcat/bin/startup.sh


Si estas atento te habrás dado cuenta porque se recomienda cambiar el nombre del apache-tomcat-9.0.0 por simplemente tomcat, pues cuando te actualices o efectúes varias operaciones similares a esta , te va tocar cambiar todo el sistema que estas configurando, para razonable lo del  cambio de nombre no ?.

Ahora decisión , muy personal, Tomcat es entre otras cosas un servidor de paginas web , pero como el servidor por defecto de los sistemas linux por lo menos los que conozco es Apache, entonces deben servir en puertos distintos , el de Apache como se sabe es el puerto 80 y el de tomcat erl 8080,  como decía si deseamos que el servidor de paginas se Tomcat ( sino para que lo estoy montando ? ) , debemos hacer dos pasos , el primero deshabilitar los servicios del apache y configurar el servidor tomcat en el puerto 80, para lo primero existen varias alternativas , la mas sencilla es hacerlo a través del entorno gráfico , buscar el botón de configurar la computadora , buscar el ítem editar servicios y apagar el Apache, es indispensable apagar el apache o cambiarlo de puerto , sino el tomcat sobre el puerto 80 no funciona, si decides no cambiarlo , el apache queda en el puerto 80 y el tomcat en el 8080.


En cuanto al tomcat , debemos irnos al directorio /usr/loca/tomcat/conf editar el archivo tomcat/conf/server.xml , buscar las ocurrencia de la cadena 8080 y remplazarla por 80 simplemente.

Salvo error u omisión como decía un profesor en mi universidad, en aquellos gloriosos años de estudiante solo falta reiniciar el sistema.

Si todo quedó corectamente instalado, puedes ir a un navegador del sistema gráfico , firefox viene instalada en muchas distribuciones y darle simplemente  http://localhost , si hiciste el cambio de puerto o sino http://localhost:8080 s,  como decía si todo está bien debe aparecer la pagina de bienvenida del Tomcat como debería esperarse con gatico en la portada no por nada se llama el gato Tom (tomcat).

Tomcat tiene una distribución de carpetas bastante sencilla a saber:
/bin   : Están entre otros los dos archivos que ya usamos para iniciar y apagar el servidor
/conf: : Como vimos esta el archivo server.xml que permite hacer  algunos ajustes importantes en el comportamiento del servidor entre otros e que acabamos de hacer de cambiar el puerto de atención del tomcat
/lib : Coloamos los archivos que el tomcat va usar como librerías  del sistema , de importancia por ejemplo las librerias de bases de datos por ejemplo postgres y mysql , las cuales deben ser descargadas desde sus respectivos sitios y colocadas allí en formato jar.
Recordemos que en general java , accesa las bases de datos por el protocolo tcpip , por lo que es importante configurar las bases de datos para que se comuniquen con Tomcat por tcpip (socket), recordar este detalle , para evitarse dolores de cabeza y perdida de tiempo tratando de comunicar una aplicación desde Tomcat con una base de datos cualquiera.
/webapps : Allí colocamos todas aplicaciones que Tomcat va  servir, incluyendo una que el sistema llama ROOT , que es donde esta la pagina de inicio con el gato Tom de que hablamos arriba.
Cualquier desarrollo que se haga sobre este servidor debe estar en esta carpeta , puede estar desplegada o en formato war.
Tener esta carpeta muy presente , por aquí es que  residen todo los apliacativos y extensiones del tomcat , y como no allí debemos colocar nuestro Axis2 , del que no hemos dicho ni muuu.

Dentro de esta carpeta hay varias sub-carpeta una muy interesante es la WEB-INF/classes , donde se colocan los java bean para el manejo de persistencia en Tomcat. (recordemos que las paginas web no tienen "memoria" y por lo tanto hay que implelemntar un medio para que los parametros pasen de una página  a otra pagina sin perderse los java bean entre otras tecnologias viene en nuestra ayuda en esta problematica.

Como había dicho instalar Axis2 , que es en el fondo lo que nos interesa es tan simple como descargar el axis2 desde el su sitio en https://axis.apache.org/axis2/java/core/download.html para los bin y https://dlcdn.apache.org/axis/axis2/java/core/1.8.0/axis2-1.8.0-war.zip para el war, de los cuales hablaremos  , no que casualidad es también un proyecto Power de Apache, como quien dice debe trabajar sobre tomcat como sobre ruedas y efectivamente así es.

La versión estable actual en el momento de escribir este articulo es la 1.8.0 al 29/12/2021
Debemos ir al sitio de descarga , debemos proporcionarnos de dos de los archivos que allí aparecen, uno de extensión bin y otro de extensión war , para el efecto de instalar axis2 como servidor de web Service basta desempaquetar el archivo war con el comando unzip , simplemente copiarlo en el directorio apropiado del tomcat en /usr/local/tomcat/webapps. no hay que hacer nada mas , pues el Tomcat es tan inteligente que sabe que acabamos de copiar el archivo WAR en sus carpeta de aplicaciones e inmediatamente lo reconoce ,
de nuevo salvo error u omisión , vamos al navegador y digitamos http://localhosts/axi2  o http://localhost:8080/axis2 , debe aparecer la plumita característica de Apache dando la bienvenida a axis2. ya esta instalado axis2 del lado del servidor.

La instalación del cliente es otro cuento, ya usamos para nada el Tomcat, desempaquetamos el archivo bin que descargamos , podemos hacerlo en el mismo sistema linux que estamos operando o en cualquier otro incluso en windows  si así lo deseamos,  en cualquier sistema operativo que estemos es de vital importancia que el java puede identificar todas las librerías del axis2/lib ya que allí residen utilidades que se requieren para la compilación de la aplicación del lado del cliente , además en el directorio axis2/bin están las utilidades de generación del código del stub que nos va servir para comunicar nuestro cliente aquí definido con el servidor previamente instalado en tomcat.

Una vez tengamos ambas puntas de la configuración del servidor (service) y cliente en axis2 debemos crear una estructura tanto en cliente como en el servidor que axis2 reconozca y nos perita colocar allí el servicio que vamos a publicar, para que nuestro cliente axis2 lo consuma.

Bien supongamoa que tengo un sitio web desde donde voy a  publicar el servicio y que voy a llamar www.misitio.com y que tengo un cliente externo al cual le voy a prestar el servicio que se llama vendedorweb  (este es el nombre del servicio de un sitio ), y puedo llamarlo como mejor me convenga , en cambio el nombre del sitio www.misitio.com debe existir y estar funcionando para poder ser accesado desde afuera del servidor a través de la web.

Con lo anterior definidos debo crear la siguiente estructura en el servidor , suponiendo que tenmos el tomcat en /usr/local/tomcat y hemos colocado como se dijo anteriormente el paquete axis2 en la carpeta /usr/local/tomcat/webapps ,si todo esta de conformidad a lo dicho debemos hubicarnis en la carpeta de axis2 : /usr/local/tomcat/web/axis2/WEB-INF/services

Allí hacemos las siguientes carpetas : una dentro de la otra :

 con el comando mkdir

recordando que el servidio se llama  vendedorweb y que el sitio desde donde estoy publicando es ww.misitio.com

vendedorweb/com/misitio

se debería observarse que  www.misitio.com se dividió en su dominio (com) y su dirección misitio.

la estructura completa donde voy a colocar mi servicio a pubicar queda :

/usr/local/tomcat/web/axis2/WEB-INF/services/vendedorweb/com/misitio

Esto es así porque más adelante tendremos que desarrollar el servicio propiamente dicho el cual esta en java , y se debe recordar que en java , se debe declarar de forma explicita el archivo o grupo de archivos que constituyen la aplicación , mediante la instrucción package en cada uno de los archivos que constituyen el servicio en este caso el package es :  com.misitio 

la cabecera  de todos los archivos .java que constituyen el servicio vendedorweb  de este ejemplo deben comenzar con:


package com.misitio ;

Axis 2 tiene como raíz de sus sistema de referencia : /usr/local/tomcat/webapps/axis2/WEB-INF/services/
como se declaró arriba , luego viene el nombre del servicio (vendedorweb) y el paquete del servicio misitio.com , en la nomenclatura java  com.misitio

vamos entnces a poblar con un ejemplo sencillo la carpeta final de la estructura que generamos en este caso misitio.

En general perosnalmente siempre creo un comando de compilación de la aplicación para recordar como debo hacerlo además de facilitarme el digitar esta cada ves, mientrasestoy en el proceso de desarrollo , lo llamó compila

contiene una linea de instrucción para compilar el package de servicio así:

compila:
#   Comando de compialcion del sitio misitio.com  servicio  vendedorweb

javac *.java

recordar darle permisos de ejecución con el comando de linux  chmod ugo+wrx compila.

creemos un a archivo con el servicio que vamos a prestar en el interior de la carpeta misitio.

archivo vendedorweb.java

/* Este archivo solicita el código y nombre de un vendedor y regresa un mensaje
    saludando al vendedor con su nombre y respectivo codigo
*/

package com.misitio;


public class vendedorweb
{

    public String setVendedorCodigo(String codigo,
                                                           String nombre)

    {
       return ("Bienvenido " + nombre + " su codigo es : " + codigo) ;
    }
}

Para resaltar en este pequeño archivo:
1.  Como todo  proceso en java el nombre del archivo y la clase deben coincidir
     vendedorwab en este caso
2. Debe  existir uno o mas procedimienos dentro del servicio del tipo set o get  (beans) desde donde  se colocan o piden variables del servicio.
3. El cuerpo del procesamiento puede ser tan complejo como se quiera pudiendo incluso hacer     llamdo a distintas funciones o del package misitio o del java en general, use DB, etc..
4. El bean setVendedorCodigo , posee dos argumentos llamados nombre y codigo,
    estos nombres de variables solo serán validos en esta carpeta , ante el cliente del sistema se conocerán como arg0 , arg1 etc , esto es MUY IMPORTANTE y es una de las primera causas de problemas cuando uno se inicia en este tipo de sistemas.
5. Toda la complejidad del que hacer del negocio , queda encapsulada en esta carpeta, aquí no van ni impresiones, ni entradas de teclado,  ni presentaciones en pantalla, ya que la vista como se llama en este tipo de estructuras (MVC) , queda en el lado del cliente con todas su interfaces gráfica si se quiere.
6 . El uso de bases de datos y demás se hace de acuerdo al uso convencional de java para tipos de bases a SQL través de jdbc , mongodb y sus mongodb-drivers si es el caso o odbc para cualquier otro tipo de conexión

Si todo quedó correcto puede invocar el comando que hicimos   ./compila (ojo al punto y el slash para indicar que queremos el compila de esta carpeta y no otra).
Si se desea cuando todo este funcionado correctamente se puede empaquetar todo el proceso en un archivo war , para optimizar los recurso del sistema

ahora vamos a inscribir nuestro servicio en el WS.

buscamos la carpeta /usr/local/tomcat/webapps/axis2/META-INF

allí deberíamos encontrar un archivo services.xml donde vamos a localizar nuesto servicio vendedorweb con todos sus procedimientos.

archivo services.xml


<services>
   <parameter name="Service class" locked="false">
                       com.misitio.vendedorweb
   </parameter>
   <operation name="setVendedorCodigo">
    <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMmessageReceiver">
</services>

En este archivo se inscribe el servicio <service> , vendedorweb para el caso que estamos desarrollando en la etiqueta xml , <parameter> y el procedimiento(s) a ejecutar setVendedorCodigo, mediante la etiqueta <operation>

Si el sistema compila sin error , con un navegador ingresando a www.misitio.com/axis2/services se debe poder ver el servicio vendedoweb  y su archivo wdsl (formato xml).

-----------------------------------------------------------------------

Hasta aqui, lo que hemos hecho es poner un servicio , para que pueda ser "consumido", por un cliente desde cualquier lugar de la web.
Aunque el servicio fué hecho enteramente en java, en contenedor java Tomcat y WS en java , NO IMPLICA para nada que el cliente del otro lado del servio tenga porque ser en java, ni en linux, y esa es la belleza de los web service, permiten que dos sistema que no se conocen de nada ni en bases de datos , ni lenguaje , sistema operativo o procedimientos intercambien
información sin problema.

Sin embargo como yo si insisto en hacer mis cosas , hasta donde se pueda en la misma estructuras y plataformas en este caso JSP, Java , ya que las posibilidades de que me salte la liebre ,cuando menos lo espere , con un problema que ni siquiera se de donde proviene se reduce al no tener tantas plataformas y estilos cruzados , aquí les voy a indicar algunos
pasos básicos para la creación de un cliente en java para el WS axis2.

Como ya lo indique arriba es necesario haber descargado el archivo de extensión bin desde el sitio de axis2 http://axis.apache.org/axis2/java/core/
Una vez descargado y colocado en una carpeta independiente que yo colocare en mi famoso directorio
/usr/local,  NADA QUE VER CON EL SERVIDOR EN TOMCAT, una cosa es una cosa y otra cosa es otra cosa , solo estoy usando la carpeta por facilidad de hecho en este servidor linux, mac , solaris o windows o , es probable o lo mas seguro es que el servidor TOMCAT no siquiera exista. hecha esta aclaración, debemos tener una carpeta instalada  /usr/local/axis2 , donde residen las librerias JAVA para ser usadas por el cliente así como algunas utilidades que nos facilitan la vida a la hora de crear el cliente.

Como este es un desarrollo puramente java , debemos hacer que el CLASSPATH del sistema reconozca todas las librerias de la carpeta /usr/local/axis2/lib, y que tenga acceso el sistema a la carpeta /usr/local/bin
donde hay una utilidad particularmete útil llamada java2wsdl, para la creacion del stub que vamos necesitar para la comunicación con el servidor WS , y su respectivo servicio vendedorweb de mi sitio.com.

He usado aquí varias veces la palabra stub,  este sin ser rigurosos en la definición no es mas que un trozo de
código auto_generado por la utilidad java2wsdls, y que lo que hace es coger el codigo XML que genera el servidor del servicio en WDSL y presentarlo de forma transparente a nuestro cliente para que la comunicación se establezca y ponga disposición del cliente los parámetros del procedimiento invocado,

vendedorweb -> setVendedorCodigo(arg0,arg1) desde misitio.com


Empecemos por definir la estructura del cliente , de forma similar a como lo hicimos con el servidor, y por los mismos motivos de uso del package en los sistemas java.

/usr/local/axis2/vendedorweb/cliente/cliente/src/com/misitio

En la carpeta /usr/local/axis2/vendedorweb/cliente definimos el cargador de stub para que nos ponga  a disposición del cliente el proceso de interface entre el servidor y el cliente yo lo llamo wsdl y que es sencillamente un archivo ejecutable que invoca la utilidad axis2/bin/wsdl2java con algunos parámetros de intéres.
el archivo en cuestión es el siguiente:

contenido del archivo  wsdl

/usr/local/tomcat/axis2/bin/wsdl2java -uri http://misitio.com/axis2/services/vendedorweb?wsdl -o client

La primera parte no es mas que la invocación de la utilidad generadora del stub de la que venimos hablando totalmente cualificada el parametro -uri esta llamando al servicio vendedorweb que debe estar ya disponible el WS , en el www.misitio.com ,  y le estamos diciendo que lo grabe un archivo src (fuente .java)  en un directorio que llamamos cliente a partir de la posición llamadora  es decir en :

/usr/local/axis2/vendedorweb/cliente/cliente/src/com/misitio


Se ve entonces que se esta poblando la estructura que hicimos previamente.

al ejecutar este comando , porque como dije es un ejecutable se crean 2 archivos en la carpeta antes enunciada


vendedorwebCallBackHandler.java
vendedorwebStub.java


Ambos deben ser incrustados en nuestra cliente , ya que son los encargados de hacer todo el trabajo pesado de la integración .


ahora veamos como luce un cliente que usa nuestro sistema WS y su correspondiente stub

voy a llamarlo TestVendedor.java.


/* Archivo de test para el WS de www.misitio.com */



pubic class TestVendedorWeb


         public static void  main (String[] args) throws Exception
           {
              vendedorwebStub = new vendedorwebStub() ;


              /* aqui definimos el punto de comunicación con WS en la variable request */


             misitio.com.vendedorweb.setVendedorCodigo = request new          misitio.com.vendedorweb.setVendedorCodigo();


            /* Aqui le pasamos los parámetros nombre= arg0  y código=arg1 al WS */

                request.arg0 = "12345"  ;
                request.arg1 = "Carlos" ;


           }

         /* Definimos la salida desde el WS al cliente */     
       
         com.misitio.vendedorwebStub.SetVendedorCodigoResponse  response = stub.SetVendedorCodigo(request) ;

       /* presentamos en la consola la respuesta dada por el WS a la petición del cliente
           podría perfectamtne ser almacenada en una base de datos , manipulada etc */

          System.out.println( "Respuesta del WS :  "response.get_return());


}


Como se puede ver en 10 lineas de código quedaron integrados dos sistemas distintos, enviando y
recibiendo respuesta.
No se necesitan conocimientos exhaustivo de java ni de comunicaciones , pues responde en realidad a unos pasos muy precisos, he notado que la mayor dificultad estriba en comprender la estructura de las carpetas lo que en ellas se almacena y la correcta definición de las variables tanto en el cliente como en el servidor.








































Comentarios

Entradas populares