jueves, abril 16, 2009

Error WSWS3047E al consumir un webservice en Rational Web Developer

Relacionado al Post Anterior, estabamos tratando de consumir un webservice desde el Rational Web Developer de IBM.
Cuando consumiamos el webservice desde visual basic o desde el SoapUi, lograbamos consumirlo perfectamente, pero al tratar de consumirlo desde el RWD6 nos daba error.

El problema específico que estabamos teniendo con este webservice es que luego de invocar al mismo, al traer los resultados de la ejecución nos estaba dando este mensaje:


WebServicesFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException
faultString: org.xml.sax.SAXException: WSWS3047E: Error: No se puede deserializar el elemento cod_Cuenta del bean dataTransferObject.customerABE.customerDomain.framework.scl.tmmas.com.RegistroComercialDTO.
faultActor: null
faultDetail:

El servicio se ejecutaba, es decir, la llamada fue correcta y se hacian las acciones del servicio. Pero no lograbamos obtener el objeto que trae los resultados obtenidos de la ejecución. El servicio no fue desarrollado por nosotros y no teniamos acceso tampoco a los logs del servidor (del servicio) como para poder identificar el problema. Esto nos hizo perder mucho tiempo en pruebas infructuosas.

Instalamos y probamos el TCPMon para rastrear el problema y encontramos que la respuesta del webservice si se estaba enviando por la red, pero que (como dice el error) no se podía parsear. Cambiamos los wsdl con tipos de datos String asumiendo alguna posible incompatibilidad de tipos entre el servicio y el cliente. No funcionó.

Los servicios fueron desarrollados sobre WebLogic.

Luego de algunas investigaciones, encontramos que al parecer habia cierta información que se enviaba en la respuesta que no era acorde a las especificaciones RFC de XML. Y que esto es lo que estaba dando el problema.

http://www-01.ibm.com/support/docview.wss?uid=swg21220377


Procedimos a cambiar nuevamente el wsdl indicandole la propiedad
elementFormDefault="unqualified" al wsdl y recrear el cliente y apartir de ahi empezamos a consumir correctamente los servicios.

El unqualified es porque el weblogic no genera los namespaces usando las especificaciones RFC al 100% mientras que el websphere sí.


saludos!



miércoles, abril 15, 2009

TCPMon

Ayer tuve que trabajar en un problema complicado relacionado con un webservice. No lograba encontrar el error. Probaba el servicio desde unas aplicaciones en .net y funcionaba correctamente, pero al probarlo desde mi aplicación java, enviando los mismos parametros no lograba hacerlo funcionar.

Leyendo en internet encontré un producto buenísimo que se llama TCPMon. Este me sirvió para poder ver los paquetes enviados por la red, como un sniffer. Con esto pude rastrear lo que estaba enviando al WebService y lo que me contestaba exactamente y así logré encontrar el error.

Yo estaba consumiendo un servicio en el SERVERXXX con el puerto 7103.

Lo que hice fué configurar para que TCPMon actuara como listener y en un puerto 7199 y apuntara a SERVERXXX:7103.
Cambie mi aplicacion para usar localhost:7199 y pude rastrear todos los mensajes que pasaban por la red.

Me parece una aplicacion muy util para temas de webservices, aplicaciones que leen datos de sockets, analisis de paquetes http.

saludos!

sábado, abril 04, 2009

Configurar Memoria en un Websphere application server 6.1 (WAS6.1)

Como Configurar el tamaño de la Memoria en un Websphere application server 6.1 (WAS6.1)

Hace algún tiempo tuve que reconfigurar la configuración de la memoria de un WAS. Un tema "relativamente" facil. Hoy lo haré de nuevo, les cuento los detalles:

Creo que por default el servidor asigna un rango de 256MB a 512MB.


Entro al administrador y busco el servidor de aplicaciones que tengo configurado.


Busco las opciones del JVM, donde dice "definición de procesos". (mi was esta en español :s )

y luego seteo el tamaño de memoria (heap) maximo e inicial.

aplico los cambios y luego bajo el servidor. C:\IBM\WebSphere\AppServer\bin>stopserver server1 ADMU0116I: La información de la herramienta se está anotando en el archivo C:\IBM\WebSphere\AppServer\profiles\AppSrv01\logs\server1\stopServer. log ADMU7702I: Dado que server1 se ha registrado para ejecutarse como un servicio de Windows, la petición de detener este servidor se realizar deteniendo el servicio de Windows asociado. ADMU0116I: La información de la herramienta se está anotando en el archivo C:\IBM\WebSphere\AppServer\profiles\AppSrv01\logs\server1\stopServer. log ADMU0128I: Iniciando herramienta con el perfil AppSrv01 ADMU3100I: Leyendo la configuración para el servidor: server1 ADMU3201I: Se ha emitido una petición de detención del servidor. Esperando el estado de detención. ADMU4000I: La detención del servidor server1 ha finalizado.


Reinicio el servidor:
C:\IBM\WebSphere\AppServer\bin>startserver server1 ADMU0116I: La información de la herramienta se está anotando en el archivo C:\IBM\WebSphere\AppServer\profiles\AppSrv01\logs\server1\startServer .log ADMU7701I: Dado que server1 se ha registrado para ejecutarse como un servicio de Windows, la petición de iniciar este servidor se realizará iniciando el servicio de Windows asociado. ADMU0116I: La información de la herramienta se está anotando en el archivo C:\IBM\WebSphere\AppServer\profiles\AppSrv01\logs\server1\startServer .log ADMU0128I: Iniciando herramienta con el perfil AppSrv01 ADMU3100I: Leyendo la configuración para el servidor: server1 ADMU3200I: El servidor se ha iniciado. Esperando el estado de inicialización. ADMU3000I: Servidor server1 abierto para e-business; el ID de proceso es 2920

Luego de esto... listo! el server tiene nueva memoria.


Troubleshooting
Cuando hice esto hace algún tiempo, tuve el problema de que por alguna extraña razon el servidor no levanto por falta de memoria. Es decir, le estaba asignando mas memoria de la que el servidor tenía. (esto probablemente lo detalle en un post luego del cambio que haga hoy ;)
Esto me provocó que no pudiera entrar al administrador de was a configurar nuevamente la memoria.

Lo que hice fue buscar el archivo server.xml C:\IBM\WebSphere\AppServer\profiles\AppSrv01\config\cells\carloscNode01Cell\nodes\carloscNode01\servers\server1\server.xml
Y modificar la configuración de la memoria desde el archivo de texto:
initialHeapSize="512" maximumHeapSize="1024"

luego reinicie el server y funcionó de nuevo ;)

saludos!