lunes, 17 de junio de 2013

Despliegue de un cliente Axis en WebLogic

Recientemente un cliente necesitaba consumir un servicio Web en Axis que adicionalmente está protegido con una política WSS4J (token x509), dada la no interoperabilidad con Oracle Web Service Manager para esta política se desarrolló una aplicación cliente que pudiera consumir el servicio. Ahora el desafío era hacer el deploy de dicha aplicación en Oracle WebLogic Server, esta aplicación estaría expuesta como servicio Web para que pudiese ser utilizada desde un proceso BPEL.

En este caso utilizamos JDeveloper para configurar nuestra applicación, es de gran ayuda para crear los descriptores de despliegue que se requieren. Los puntos clave para lograr el deploy son:

1. Dar prioridad a las librerias requeridas en el descriptor de despliegue weblogic.xml. Si no existe lo creamos dentro del directorio WEB-INF de nuestra web application.

<?xml version = '1.0' encoding = 'UTF-8'?>
<weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-web-app http://www.bea.com/ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd"
                  xmlns="http://www.bea.com/ns/weblogic/weblogic-web-app">
  <container-descriptor>
    <prefer-web-inf-classes>true</prefer-web-inf-classes>
  </container-descriptor>
</weblogic-web-app>

2. Especifiar los paquetes que debe utilizar, en este caso los de Axis y no los de WebLogic, así como los parsers de XML requeridos por el mismo axis. Creamos o modificamos el descriptor weblogic-application.xml, por ejemplo:

<?xml version = '1.0' encoding = 'UTF-8'?>
<weblogic-application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-application http://www.bea.com/ns/weblogic/weblogic-application/1.0/weblogic-application.xsd"
                      xmlns="http://www.bea.com/ns/weblogic/weblogic-application">
  <xml>
    <parser-factory>
      <saxparser-factory>org.apache.xerces.jaxp.SAXParserFactoryImpl</saxparser-factory>
      <document-builder-factory>org.apache.xerces.jaxp.DocumentBuilderFactoryImpl</document-builder-factory>
      <transformer-factory>org.apache.xalan.processor.TransformerFactoryImpl</transformer-factory>
    </parser-factory>
  </xml>
  <prefer-application-packages>
    <package-name>org.w3c.dom.*</package-name>
    <package-name>org.xml.sax.*</package-name>
    <package-name>com.ctc.wstx.*</package-name>
    <package-name>com.sun.activation.*</package-name>
    <package-name>com.sun.org.apache.*</package-name>
    <package-name>oracle.core.lmx.*</package-name>
    <package-name>oracle.core.lvf.*</package-name>
    <package-name>oracle.jdbc.*</package-name>
    <package-name>oracle.jdbc.connector.*</package-name>
    <package-name>oracle.jdbc.driver.*</package-name>
    <package-name>oracle.jdbc.internal.*</package-name>
    <package-name>oracle.jdbc.oci.*</package-name>
    <package-name>oracle.jdbc.oracore.*</package-name>
    <package-name>oracle.jdbc.pool.*</package-name>
    <package-name>oracle.jdbc.util.*</package-name>
    <package-name>oracle.jdbc.xa.*</package-name>
    <package-name>oracle.jpub.runtime.*</package-name>
    <package-name>oracle.net.ano.*</package-name>
    <package-name>oracle.net.jndi.*</package-name>
    <package-name>oracle.net.ns.*</package-name>
    <package-name>oracle.net.nt.*</package-name>
    <package-name>oracle.net.resolver.*</package-name>
    <package-name>oracle.security.o3logon.*</package-name>
    <package-name>oracle.sql.*</package-name>
    <package-name>oracle.sql.converter.*</package-name>
    <package-name>org.apache.*</package-name>
    <package-name>org.springframework.*</package-name>
  </prefer-application-packages>
</weblogic-application>

3. Hacer el deploy de la aplicación (EAR) no del proyecto, para que se lleve el weblogic-application.xml. Y no olvidemos especificar que el empaquetado del proyecto (WAR) incluya las librerías requeridas.

4. Opcionalmente, si el servicio Web que va a consumir nuestro cliente esta protegido con WSS4J, registramos el proveedor de seguridad en el JDK que utiliza nuestro servidor WebLogic (esto requiere reiniciar el servidor).

     - Colocar la libreria bcprov-jdk15-132.jar en $JDK_HOME/jre/lib/ext

      - Modificar el archivo java.security localizado en $JDK_HOME/jre/lib/security. Agregar la clase org.bouncycastle.jce.provider.BouncyCastleProvider como provider. Por ejemplo:

security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider

     Con esta configuración evitamos el siguiente error:
org.apache.axis2.AxisFault: WSHandler: Encryption: error during message processingorg.apache.ws.security.WSSecurityException: An unsupported signature or encryption al
gorithm was used (unsupported key transport encryption algorithm: No such algorithm: http://www.w3.org/2001/04/xmlenc#rsa-1_5)


Aqui les dejos algunos sitios que me ayudaron a realizar el deploy:
http://techasilo.blogspot.mx/2007/04/call-to-web-service-has-become-nerve-of.html
http://blog.guident.com/2011/12/deploying-axis2-applications-on-oracle-weblogic-server/
http://mail-archives.apache.org/mod_mbox/ws-wss4j-dev/200609.mbox/%3c4e3ba4880609010756i59e0a5b6s12d875f0b2263c1f@mail.gmail.com%3e

viernes, 7 de junio de 2013

Cambiar la versión de Java (JDK) en WebLogic

Algunas veces es necesario actualizar o cambiar la versión de Java (JVM - JDK) que actualmente tenemos instalado. Podemos hacer este cambio ya sea para toda la instalación del software que tiene como raíz nuestro Middleware Home o simplemente para un dominio WebLogic.

Voy a presentar el procedimiento que se realizo para cambiar la versión del JDK 1.6 a la 1.7 de una instalación WebLogic y que además cuenta con Oracle SOA Suite, Oracle Service Bus.

En este escenario tenemos dos servidores de aplicación, soahost1 y soahost2, aprovisionados con:
WebLogic Server 11g
Oracle SOA Suite con Oracle Service Bus 11g

$MW_HOME representa nuestro Middleware Home.

1. Parar todos los servicios, tanto en los servidores de aplicación como en el servidor Web.
a.       Node Manager
b.      Servidores Manejados
c.       Servidor de Administración

2. Actualizar el archivo commEnv.sh con la ruta del JDK 1.7
$MW_HOME/wlserver_10.3/common/bin/commEnv.sh


3. Actualizar el archivo setDomainEnv.sh de nuestros dominio(s) WebLogic.
$MW_HOME /user_projects/domains/soa_domain/bin/setDomainEnv.sh



4. Opcionalmente y para ser consistente actualizamos el archivo nodemanager.properties de nuestros Node Managers.
$MW_HOME /wlserver_10.3/common/nodemanager/nodemanager.properties


5. Iniciar los servicios

6. Comprobar que se ha tomado la nueva versión de Java, revisamos los logs