lunes, enero 21, 2013

Configurar 2 certificados SSL en un mismo Apache

Tengo un servidor Apache funcionando con su nombre de dominio, un SSL y un proxypass hacia una máquina interna en la red que tiene la aplicación. Esto funciona bien desde hace tiempo.

Resulta que se hizo una aplicación nueva que debe estar en SSL con su propio dominio y certificado SSL.

Para configurar el dominio no hay problema solamente agregué un VirtualHost por nombre y funcionaba ok. (uno así para HTTP y otro para HTTPS usando los certificados)


Usar 2 puertos distintos: se verá muy feo. porque tendríamos que acceder a http://server:8443/algo y puede que algunos ISP incluso bloqueen puertos y puede dar problemas.

La parte del "directory" la puse porque me daba un problema de que no tenía acceso al directorio. Al final no revisé si era necesaria o no.

En el DocumentRoot tengo un index.html que hace un META REFRESH hacia la url http://web.server.com/miaplicacionweb o http://movil.server.com/miaplicacionmovil

Al momento de querer poner el certificado la cosa se complicó. Puse el SSL y me dió este error:
Init: You should not use name-based virtual hosts in conjunction with SSL!!

Leyendo la documentación encontré que hay un problema con esta configuración ya que el apache no puede usar múltiples SSL en una misma IP+Puerto.
http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts2

Entiendo que el problema es por esto: El SSL cifra el contenido de la página. Cuando Apache debe decidir cual virtualhost usar, para saber que SSL se usa debe decifrar el contenido de la página y como está cifrada apache no sabe cual certificado utilizar.

En el caso de tener múltiples IP's puede filtrar el virtualhost por IP sin tener que descifrar nada y ahí si funciona.
(confuso: si.    Estoy seguro: no. Pero eso entendí :p )

Alternativas:
Poner 2 IP's en la misma máquina: hay que tener 2 IP's públicas.

Lo primero que se hizo fué solicitar 2 IP's públicas. Como era una máquina virtual se le creó una segunda tarjeta de red y se le puso una segunda IP.

Como estaba atras de un Firewall las IP's publicas se nateaban en algún router y llegaban a las IP's privadas. Algo así como:
200.x.x.1 Publica1 apunta a 192.0.1.1 Privada1 (eth1)
200.x.x.2 Publica2 apunta a 192.0.1.2 Privada2 (eth2)

Al tener esto y los DNS's configurados:
web.server.com en 200.x.x.1
movil.server.com en 200.x.x.2
* esto lo confirmaba haciendo un nslookup web.server.com y luego un telnet web.server.com 80 (para ver si respondía el puerto).

Luego hice la configuración de virtualhost por IP. (IP-NAMED dice la configuración de apache). Perdí 4 horas de mi vida tratando de entender porque no funcionaban los virtualhost.

Para ver el problema le puse un log distinto a cada virtual host. Luego de batallar un buen rato encontré que el problema era que yo estaba usando en el virtualhost las ips publicas y no las internas. Al final, la conclusión es que hay que usar las ip's privadas. Dejando la configuración algo asi:


Para HTTP:



y para el HTTPS:



y ya. con eso debe de estar funcionando correctamente.

saludos!

lunes, abril 30, 2012

Instalar Office 2007 en Ubuntu 12.04


Acabo de instalar Ubuntu 12.04, en una máquina limpia.

Parte de lo que debía hacer es instalar office. Uso el LibreOffice para el 80% de los temas, pero hay un 20% de temas que requieren office. (MSProject y algunos archivos que deben tener cierto formato).

En la 11.10 había seguido este manual (http://www.ubuntubuzz.com/2011/09/install-microsoft-office-2007-in-ubuntu.html) pero ahora me dió un problema, cuando trataba de instalar el dll dotnet20 me daba este error: "This product is not supported on a 64-bit operating system. Setup will now exit." desde una ventanita de windows.   Recordé que puse la versión de 64 bits de ubuntu. (no recuerdo si en 11.10 tenia 64 bits.. pero.. no importa).

Luego de algunas pruebas vi que tenía que hacer esto:

1. descargar ultima version de wine *no se si es necesario pero igual lo dejo.
Actualizar el Wine:
sudo add-apt-repository ppa:ubuntu-wine/ppa
sudo apt-get update
sudo apt-get install wine1.3
El comando dice wine1.3 pero es la versión 1.4.  Tambíen me dió duda y lo busque :D
Verifico que esté correctamente la última versión:
wine --version
:~/.wine$ wine --version
wine-1.4
2. eliminar cualquier isntalación previa del Wine
rm -rf .wine
3. Forzar a que la máquina virtual tenga 32bits.
export WINEARCH=win32
export WINEPREFIX=~/.wine
winecfg
4. instalar winetricks
cd .wine/
wget http://www.kegel.com/wine/winetricks
chmod +x ./winetricks
./winetricks
5. Luego.. Seguir la guía que se tenía para 11.10 http://www.ubuntubuzz.com/2011/09/install-microsoft-office-2007-in-ubuntu.html saltando la parte donde dice install.wine

al final de cuentas solo agrego la parte de 32bits.

referencias:
http://appdb.winehq.org/objectManager.php?sClass=version&iId=3754
http://forums.fedoraforum.org/showthread.php?t=272681
http://pingato.wordpress.com/2009/04/16/winetricks-instalaciones-sencillas-en-wine/

Ojo.. no soy experto ni mucho menos en linux. Solo soy un usuario que soluciona los temas que vienen.  A veces sin saber exáctamente porque :D

viernes, octubre 14, 2011

Deadlock detected al obtener las conexiones JNDI en un WAS 7.0.0.13


Hace unos días dejamos en producción una aplicación que migramos de websphere 6.1 a websphere 7. (IBM WAS 7).


En principio vale mencionar que no hay nada transparente ni "migrable" entre lo que hicimos con RAD6 para que funcione en WAS7, RAD8 no soporta SDO y tuvimos que migrar "a mano" muchas cosas re-certificando toda la aplicacion, pero eso es otro tema que no comentaré a detalle.

Lo que sí quería mencionar es un error un poco raro que tuvimos luego de la salida en producción. La aplicación en testing y desarrollo funcionaba bien, pero al estar en producción empezó a dar algunos problemas, en momentos de stress de repente el WAS se colgaba completo, inclusive dejaba de responder la consola.


Revisando el SystemOut y el SystemErr empezaron a aparecer algunos errores en la clase que obtenía la conexión a la base de datos, pero no encontramos nada que nos diera una pista de que podría dar problemas.
Vale la pena comentar que como desarrollo no teníamos acceso a los servidores por lo que el proceso de resolución fué muy tortuoso y lento.

Lo primero que verificamos, lo obvio, fué pensar que había un leak de conexiones. Revisamos el systemout buscando cualquier error que nos diera una pista del error y no encontramos nada. Recibimos algunos reportes de los administradores donde se miraba que la caída era un problema que sucedía en poco tiempo (<2 minutos). No era un proceso de degradación poco a poco sino que era una caída casi inmediata.


Sospechabamos de algún reporte o algún proceso donde por algún error hubiera algún tipo de loop infinito donde no se cerraran las conexiones. No encontramos nada.
Luego encontramos en los reportes que el total de threads que tenía configurado el WAS se ocupaban al 100%, nuestra teoría en este momento era que el leak de conexiones hacía que las peticiones se encolaran en el jndi y ocuparan threads y esto hiciera que el server se cayera.
Exploramos algunas alternativas sobre la configuración del WAS, subimos los threads disponibles, pusimos un parámetro en el JNDI para que si no recibía la conexión en 5seg que diera exception. Esto aunque sabíamos que no corregía el error nos daba lapsos más grande
s entre una caída y otra y en lugar de que el was se quedara freeze empezaría a dar error de aplicación donde podríamos encontrar la raíz del problema. Hicimos los cambios y nada. Aunque subieramos los threads igual se ocupaban todos y por alguna extraña razón no respetaba el parametro que pusimos para que diera exception si no obtenía la conexión.

Un poco desesperados peinamos el código (una aplicación grande) y revisamos todas las conexiones para incluir un best practice en cuanto a cierre de las conexiones. Probamos de nuevo y nada. Es más, los errores ocurrian más seguido.

Luego un día estando en audio con los administradores de bdd y con los administradores de WAS, tuvimos una caída. Fué entonces cuando logramos tener al fin el error en las manos. Vimos las propiedades del pool y ... sorpresa! el uso del pool estaba al 50% de su capacidad... No podía ser un connection leak si solo teníamos 50% de las conexiones usadas. Ya habíamos limpiado todos los system.out.println y el systemout estaba sin ningun tema. el systemerr tampoco tenía nada. Generaron un dump de la caída y ahí vimos entonces el error.
buscando en el javacore encontramos un Deadlock detected.
Al analizar más a detalle el lugar donde se reporta el error, vimos que el metodo que muestra la traza es un metodo del pool y que no es parte del aplicativo sino parte del driver jndi de websphere.

Buscando un poco más sobre este tema encontramos algunos casos similares al nuestro:
Y encontramos luego un problema del driver de jdbc, "PK69110: THE SERVANT ABENDS CAUSED BY HUNG THREADS IN JDBC DRIVER".
Este bug tiene afectación en la versión de WAS que usamos http://www-01.ibm.com/support/docview.wss?uid=swg1PK69110&wv=1

La versión de WAS que usamos es la 7.0.0.13, encontramos entonces el problema definitivo. Un parámetro useRRASetEquals en la configuración custom del datasource.

se hizo la prueba, se pasó a producción y luego de varias semanas tratando de encontrar el problema en nuestra aplicación vimos que es un bug de WAS.

El bug era este: Cuando yo le pido una conexión al pool, el jndi usa un objeto con las conexiones utilizadas. Este objeto es compartido. Por alguna razón al tratar de reservar una conexión en el pool el objeto se quedaba tomado por otro thread y causaba un deadlock de threads. Todo esto a nivel de los javas que hacen el pool. mientras mas usuarios trataban de obtener la conexión habían más threads que se encolaban hasta que se acababan los threads del was. Luego ni siquiera la consola de WAS funcionaba y era el freeze. Como era el objeto que reservaba la conexión el error se daba antes de que el parametro de timeout que configuramos entrara y por eso no se tomaba en cuenta.
La moraleja:
hay que leer los javacore cuando hay servers colgados... aunque sean de 500MB.

saludos!

viernes, septiembre 02, 2011

Ubuntu dejó de reconocer mi modem usb

instalé hace unos días mi linux (ubuntu 11.04) y al poner mi modem de tigo todo funcionó ok, solo le cambié el APN por broadband.tigo.gt (es pospago y es un huawei e226) .-

hoy lo quise usar y no me lo reconocía la barrita de redes donde aparecía la conexión. Un poco oxidado en linux decidí buscar el var/log/messages para ver si aparecía una pista para buscar.

encontré que ahora el /var/log/messages ahora es /var/log/syslog en fin.. dejé un tail -f para ver que pasaba al conectarlo y salió algo como esto:



Sep 2 17:31:15 carloscastaneda kernel: [ 70.847353] usb 2-1.2: new full speed USB device using ehci_hcd and address 5
Sep 2 17:31:15 carloscastaneda kernel: [ 70.927358] usb 2-1.2: device descriptor read/64, error -32
Sep 2 17:31:15 carloscastaneda kernel: [ 71.117371] usb 2-1.2: device descriptor read/64, error -32
Sep 2 17:31:16 carloscastaneda kernel: [ 71.307382] usb 2-1.2: new full speed USB device using ehci_hcd and address 6
Sep 2 17:31:16 carloscastaneda kernel: [ 71.387526] usb 2-1.2: device descriptor read/64, error -32
Sep 2 17:31:16 carloscastaneda kernel: [ 71.577396] usb 2-1.2: device descriptor read/64, error -32
Sep 2 17:31:16 carloscastaneda kernel: [ 71.767412] usb 2-1.2: new full speed USB device using ehci_hcd and address 7
Sep 2 17:31:16 carloscastaneda kernel: [ 72.187310] usb 2-1.2: device not accepting address 7, error -32
Sep 2 17:31:16 carloscastaneda kernel: [ 72.267438] usb 2-1.2: new full speed USB device using ehci_hcd and address 8
Sep 2 17:31:17 carloscastaneda kernel: [ 72.687307] usb 2-1.2: device not accepting address 8, error -32
Sep 2 17:31:17 carloscastaneda kernel: [ 72.687486] hub 2-1:1.0: unable to enumerate USB device on port 2
al final encontré por acá la solución: http://www.absolutelytech.com/2009/11/01/solved-ath5k-wifi-module-not-working-in-karmic-koala/
cd /sys/bus/pci/drivers/ehci_hcd

ls
sudo sh -c 'echo -n "0000:00:xx.x" > unbind'
reinicié y listo.-

saludos!

lunes, septiembre 13, 2010

Día del programador!!


Feliz día del programador!!

Hoy se celebra el día 256 del año que es el día del programador... felicidades a todos mis compañeros.

Este día todavía no es oficial pero si insistimos cada año en celebrarlo podemos institucionalizarlo para hacer notar la importancia de nuestro trabajo en la forma en que el mundo se desenvuelve diariamente.-



saludos!

martes, marzo 16, 2010

Configurar tamaño de archivo de mantisbt

Necesitaba poder subir archivos grandes como adjuntos en mantisbt, es un tema realmente básico pero que implico cambiar todas las capas de archivos de configuracion: aplicacion, base de datos, php.

El error que recibía era:

Allowed memory size of 8388608 bytes exhausted

APPLICATION ERROR #401

Fueron varios temas los que tuve que cambiar:


php.ini
memory_limit = 32M
upload_max_filesize = 8M

config.inc de mantis:
$g_max_file_size = 8388608; # 8 MB

mysql:
max_allowed_packet = 16M

domingo, marzo 14, 2010

Orden de Arranque en GRUB2 (ubuntu 9.10)

Para cambiar el orden de arranque de linux ubuntu 9.10:
ubuntu 9.10 usa el grub2 en lugar de grub, eso me hizo perder algun tiempo leyendo en internet.

1. ver que tiene el archivo grub.cfg usando
cat /boot/grub/grub.cfg

2. se busca cual es la opcion que queremos que arranque primero, en mi caso quiero que arranque windows en lugar de linux. Mi windows esta en el orden 8.

3. modificar el default del archivo /etc/default/grub desde el gedit:
sudo gedit /etc/default/grub

4. cambio la linea y grabo
GRUB_DEFAULT=8

5. actualizo los cambios
sudo update-grub


sudo update-grub
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-2.6.31-20-generic
Found initrd image: /boot/initrd.img-2.6.31-20-generic
Found linux image: /boot/vmlinuz-2.6.31-16-generic
Found initrd image: /boot/initrd.img-2.6.31-16-generic
Found linux image: /boot/vmlinuz-2.6.31-14-generic
Found initrd image: /boot/initrd.img-2.6.31-14-generic
Found memtest86+ image: /boot/memtest86+.bin
Found Windows 7 (loader) on /dev/sda1
done


reiniciar.-

martes, febrero 09, 2010

La Cámara del Terror (Manuel José Arce)

Incluyo otro poema de Manuel José Arce, Guatemalteco.
es del libro Episodios del vagón de carga (20.05.1971)
hace unos días tenía ganas de leerlo pero no lo encontre en ninguna parte de internet así que lo publico porque no se puede negar a la gente la belleza de este poema.
------------------------------------------------------------


DE repente estoy triste
--aunque tú no lo sabes

Se derrumban de pronto
torres y catedrales.

Se nos queman las alas
y hasta las ganas de vivir se caen.

Se nos vuelven más largas y más sordas las calles.

La tristeza nos coge
a patadas infames.

Es de pronto. Al doblar una esquina.
Al decir una cosa. Al saludar a alguien.

Es una bofetada sorpresiva esta tristeza tonta.
Pero tú no lo sabes.

Porque si lo supieras tendría algún sentido.
Esta manera amarga sería menos grave.

Pero tú no lo sabes.
Y si tú no lo sabes ya no lo sabe nadie.
Ni importa que lo sepa alguna gente.
Ni es tampoco importante.

Es un poco molesto nada más
desangrarse.

Es tonto y sucio.
Sería más higiénico llegar al sicoanálisis.

De que sirve todo esto
cuando Dios se tropieza en una esquina y cae.

Cuando el cielo se vuelve algo tan torpe
que sólo sirve para molestarme.

Cuando me cae mal toda la gente.
Cuando es ridículo hasta el preguntarme.
Cuando se pone triste hasta la sombra.
Cuando tú no lo sabes.

Y si tú no lo sabes
no importa que lo sepa nadie.

Nadie.

jueves, octubre 15, 2009

Hormiga (Poema)

Otro poema, del 98. De los que escribí luego de dejar de escribir.

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

Tome mi disfraz de hormiga, y caminé,
Sólo,
En la fila de las negras voces,
En las voces de las grandes filas,
En las cara de siluetas desteñidas
y en tus labios rotos camine.

Solo para encontrar más negro,
Más cientos de hormigas disfrazadas de colores
Formadas como estrellas en una larga fila negra,
De silencios,
De misterios negros y oscuras cicatrices.

Vi como el silencio se desvanecía,
vi la luz, vi el mar
y vi una sonrisa perdida entre los destellos del viento,
luego la vi desaparecer.

Este manto negro que me cubre...
Este manto negro, piel de hormiga, que me esconde...
Como pesa ya este manto negro…!
Como pesa ya este tiempo eterno,
Como se me impregna por entre los poros esta tinta inmaterial,
que se va secando,
que se va apropiando de mis nuevos huesos negros,
de mi sangre, de mi alma y de mis ojos negros.

A donde me llevará la noche?
En que lugar susurrare ahora tu nombre,
Como poder recordarte si me olvido,
Si me pierdo en este oscuro horizonte?

Acércate más...
Acércate más que no te encuentro,
Acaríciame el rostro para saber que lo tengo,
Grita mi nombre,
No dejes que me olvide,
No dejes que me pierda,
Quítame este manto negro...

Piel de hormiga, hormiga adentro.

Caminar...
Por esta larga fila, caminar.
Por esta oscura línea, caminar.
Tanto tiempo y caminar,
Tanta hormiga y caminar,
Tanta tinta negra que se seca y nos envuelve,
Tan espeso el aire que nos une,
Ahorcándonos en esta tinta negra,
Y nos aprieta, y nos estrecha
y nos va juntando hasta que somos uno,
una sola línea,
mil puntos y una sola línea disfrazada en tinta negra,
y caminar,
Caminar...


carcasco .30.10.1998

miércoles, septiembre 16, 2009

Balanceo de Carga para dos websphere application server 6.1 usando mod_proxy_balancer

Hace varios días que vengo trabajando en un problema que me ha quitado el sueño y la tranquilidad.

Hace como mes y medio empece a leer sobre el tema de balanceo de carga desde Apache usando el mod_proxy_balancer.

http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html

Desde las guías todo parecía sencillo. Sinceramente no estaba muy claro de las modificaciones que se estaban planteando, pero para variar, empece a probar sin terminar de leer la documentación :p

Hice unas pruebas y asumi que todo estaba funcionando bien. El tema se quedó dormido durante algún tiempo, pero luego tuve que retomarlo desafortunadamente con las fechas ya bastante apretadas.

http://www.howtoforge.com/load_balancing_apache_mod_proxy_balancer

Me pareció excelente que se pudiera tener no solamente el balanceo de carga sino la tolerancia a fallos. De manera que si un server se caía, podía seguir operando con el otro server.

-- la version 1 de mi httpd.conf
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
ProxyRequests Off

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass /balancer-manager !
ProxyPass / balancer://clusterWAS/ stickysession=BALANCEID nofailover=On
ProxyPassReverse / http://192.168.15.124:9080/
ProxyPassReverse / http://192.168.15.127:9080/
<Proxy balancer://clusterWAS>
BalancerMember http://192.168.15.124:9080 route=http1
BalancerMember http://192.168.15.127:9080 route=http2
ProxySet lbmethod=byrequests
</Proxy>

<Location /balancer-manager>
SetHandler balancer-manager
Order deny,allow
Allow from all
</Location>
Hice unas pruebas y asumi que todo estaba funcionando. Pero desafortunamente en ese momento no puse mucha importancia al tema de la sesion.

Al tener mi servidor balanceando carga entre los 2 nodos, la mitad de los requerimientos va a un server y la otra mitad al otro. Pero... si entro a mi aplicacion y me firmo. Esto se guarda en una variable de sesion. Y balanceando la carga se pierde.... :(

Es decir..
Pinto pantalla de login (Nodo1)
Recibo parametros de login valido y guardo variables de sesion(nodo2)
Reenvio a pantalla de inicio (Nodo1)

El problema es que en el nodo1, nunca guarde variables asi que asume que no esta firmado y vuelve a pedir la clave.

Lei un poco sobre el tema y hablaba del stickysession.

Ahora que ya entendí les cuento que la famosa stickyession es una cookie con un id de session. Que tiene 2 partes. La session y el route.
CookieJSESSIONID=00009jrrrDW78YKKVP6BTuDqqFg.-1

Esto lo pude ver gracias al pluggin firebug de firefox. Que en la pestaña de red muestra los paquetes enviados.

No obstante no lograba que funcionara en mi esquema.

Yo tengo 2 nodos con Websphere Application Server 6.1. Los 2 tienen la aplicacion instalada y funcionando.

Luego de buscar bastante y hacer bastantes pruebas encontré que la cookie de session se envía diferente en websphere que en tomcat. Y que el apache no la entendía.
CookieJSESSIONID=00009jrrrDW78YKKVP6BTuDqqFg:-1

La diferencia es el ":" en lugar del ".".

https://issues.apache.org/bugzilla/show_bug.cgi?id=42513

No hay un parque para esto en los releases.

Tuve que recompilar el apache para inlcuir la modificación en el modulo. (esto será un post aparte).
El truco no era la recompilada de apache, el truco era, la recompilada en Windows de apache :S

Bueno... luego de recompilado el apache con la recomendación que dan en el bug. Logre que la cookie tuviera el formato adecuado... pero... aun así no funcionaba!

CookieJSESSIONID=00009jrrrDW78YKKVP6BTuDqqFg.-1

Fue luego de esto cuando comprendí que el problema es que el -1 que estaba mostrando debía ser el nombre del nodo.

En algunos post, encontre que este valor es llamado route. y se configuraba en los tomcat como jvmrouteid. En websphere no encontraba nada por el estilo.

Un poco de suerte me llevo a una url donde se miraba el debug de una traza en websphere con balanceo de carga y hablaba de un Clone ID ... http://www-01.ibm.com/support/docview.wss?uid=swg27014498&aid=1

Buscando en la documentación encontre como configurarlo y funcionó.

http://publib.boulder.ibm.com/infocenter/wasinfo/v5r1//index.jsp?topic=/com.ibm.websphere.zseries.doc/info/zseries/ae/rprs_custom_properties.html
Application servers > server1 > Web container > Custom Properties

Para el nodo uno le puse un HttpSessionCloneId de "nodo1" y al otro "nodo2".

Ahora sí. Mis cookies quedaban de la siguiente forma:
para el nodo1:
JSESSIONID=0000gQCnyQMY94sb5oVXZsLU0lR:nodo1

para el nodo2:
JSESSIONID=0000gQCnyQMY94sb5oVXZsLU0lR:nodo2

Con mi apache recompilado y con mis cookies en buen estado procedí a realizar las configuraciones que me hacían falta en el apache.

Primero habilité los módulos necesarios:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so


Luego algunos parámetros generales de la configuracion:
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>


Configuré el balance con mis 2 nodos:
<Proxy balancer://clusterPerfilUno>
BalancerMember http://192.168.15.121:9080 route=nodo1
BalancerMember http://192.168.15.123:9080 route=nodo2
ProxySet lbmethod=byrequests
</Proxy>


donde dice "route=nodo1" es el nombre que haya puesto al cloneid en mi WAS. Luego hago el proxypass en mi aplicacion hacia el balanceo.
La stickysession la hago sobre la cookie que logre setear. Y seteo el reverse para el regreso de las conexiones.

<Location /app>
Order allow,deny
Allow from all
ProxyPass balancer://clusterPerfilUno/app stickysession=JSESSIONID nofailover=On
ProxyPassReverse http://192.168.15.121:9080/app
ProxyPassReverse http://192.168.15.123:9080/app
</Location>


Puse el loglevel en debug para rastrear posibles errores y me sale algo asi:
[Wed Sep 16 16:16:57 2009] [debug] mod_proxy_balancer.c(46): proxy: BALANCER: canonicalising URL //
clusterPerfilUno/app
[Wed Sep 16 16:16:57 2009] [debug] mod_proxy_balancer.c(280): ICON: proxy: BALANCER: Found value 00006BXDRmMTJiopXVx9UnRFUCR:nodo1 for stickysession JSESSIONID
[Wed Sep 16 16:16:57 2009] [debug] mod_proxy_balancer.c(296): proxy: BALANCER: Found route nodo1
[Wed Sep 16 16:16:57 2009] [debug] mod_proxy_balancer.c(579): proxy: BALANCER (balancer://
clusterPerfilUno) worker (http://192.168.15.121:9080) rewritten to http://192.168.15.121:9080/app
[Wed Sep 16 16:16:57 2009] [debug] mod_proxy.c(993): Running scheme balancer handler (attempt 0)
[Wed Sep 16 16:16:57 2009] [debug] mod_proxy_http.c(1920): proxy: HTTP: serving URL http://192.168.15.121:9080/app

Si no tengo buena la cookie recibo el found value (null) for stickysession JSESSIONID.

con esto logre hacer el balanceo de carga usando mod_proxy_balancer con un websphere 6.1 en los nodos.

En los proximos días estaré haciendo pruebas de esto y si encuentro algo mas lo publico.

Espero poder publicar la recompilada del apache sobre windows y también una segunda alternativa que estuve a punto de implementar.

Cabe mencionar que el IHS de IBM es una alternativa que no logre a terminar de evaluar para resolver este problema.

saludos!

miércoles, agosto 26, 2009

ORA-04030: out of process memory when trying to allocate 123404 bytes

Hace algunos días empece a recibir errores extraños en una de nuestras aplicaciones. Ocasionalmente nos reportaban que no podian hacer algo o que no se mostraba cierta información, pero cuando volvían a probar la aplicacion empezaba a funcionar correctamnete.

El problema con este tipo de reportes, es que son bastante difíciles de encontrar y de replicar, por consiguiente se empiezan a volver difíciles de resolver.

La aplicación es una aplicación web en java que consulta una base de datos oracle, ambos servidores estan corriendo sobre windows.

Lo primero que hicimos fue empezar a generar logs adicionales a los bloques de codigo que pensabamos pudieran estar fallando, empezamos a encontrar errores de este tipo desde mis programas:

java.sql.SQLException: ORA-04030: out of process memory when trying to allocate 123404 bytes (QERHJ hash-joi,kllcqas:kllsltba)

y desde el sistema operativo empece a ver errores en el event viewer que decían que no se podía asignar memoria a un thread de la base de datos.

Aclaro que no soy DBA, soy desarrollador. Pero a veces como desarrollador es necesario involucrase en temas de infraestructura para poder identificar los problemas que suceden.

Tenía una maquina con 4gb de ram y cuando miraba la memoria de la maquina no pasaba de los 2gb.

Encontramos 2 temas que estaban causando el problema:
1. El servidor es un windows de 32 bits, y por ser un windows de 32 bits no puedo tener ningún proceso en ejecución con mas de 2gb de uso de memoria.
Se modifico el boot.ini del servidor para que pudieran utilizarse hasta 3 gb de ram en un solo proceso.

http://technet.microsoft.com/es-es/library/bb124810.aspx

2. Revisando los parámetros de la base de datos, encontré que se tenía configurado un SGA de 2GB y un PGA de 1.6GB. Por lo que el tamaño del proceso que estaría ejecutando el oracle llegaría a tener hasta 3.6 GB en memoria. Procedímos a cambiar los parámetros de configuracion de la base de datos para corregir el tema.

Este cambio se hizó en los parámetros, sga_target y pga_aggregate_target.

saludos!

sábado, agosto 01, 2009

Silla (poema)

Antes de ser programador (durante mi adolescencia) era más artístico. Escribí algunos poemas que a veces leo y que guardo con mucho cariño. Hoy publicaré un poema o escrito que hice hace ya algún tiempo en una fugaz comunicación entre los 2 lados de mi cerebro.

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

Silla

Una mañana desperté, y estaba muerto. Escupiendo gusanos por mi ojos, estaba sentado frente al monitor de siempre, con la manos sobre el teclado, con raíces brotando de mis uñas y encarnándose en el decadente espacio de la alfombra.
Muerto.
Con un pequeño resplandor en mi rostro, reflejo del ups aún prendido.
A lo lejos, todavía se escuchan los susurros sobrantes de cientos de reuniones sobre la mesa, de miles de discusiones infructuosas y banales. Hoy nada.
Solo yo,
Muerto.
Desvestido ya; más la ropa está aún planchada sobre mis piernas.
No recuerdo cuando me quedé dormido, no recuerdo cuando olvidé mi nombre, o el tuyo. Solo sé que paso… y que seguía sentado.
Una mancha de café sobre la mesa... y en el amarillo de mis dientes.
¿Cuándo comenzó a endurecerse mi rostro… y cuándo mis manos?
¿Cuándo empezó a confundirse el día y la noche… y cuándo dejo de importarme?
Todo pasa… Y el pasado se convierte en un pequeño resentimiento a la nostalgia, y en seguir allí. Absorbiendo la luz del monitor, dejando que mis ojos se carcoman. Y mi voz, cada ves mas callada y sola.
Sentado.
¿Cuántas veces tendré que morir para olvidar esto?
¿Cuántas veces volver a pensar lo mismo… y seguir tratando?
¿Cuantos silencios?… solo quedo yo, sentado, destruyéndome, viendo como mi deformado cuerpo se esconde tras mi mente… Y la luz del monitor! siempre allí, prendido, con su maldito calor quemándome, pegando mis articulaciones hasta el punto de no poder levantarme.
Sigo aquí sentado en esta silla cada vez mas grande, las ventanas cada vez mas chicas, el frió del aire, la Luz del monitor, las gigantescas paredes, el inalcanzable techo, las enormes sillas y mis delgadas y secas piernas que se enredan en sus patas llegando a la alfombra, arañándola, rasgándola, como queriendo enterrarse. Y los gusanos que se arrastran por mi cuerpo y me comen.
Y me seco, y me muero… Ya mi cuerpo no responde y no se levantarme. Solo seguir sentado. Me quedo quieto… y por momentos duermo. Abro los ojos y es igual, duermo otra vez. Seguir tratando. Solo puedo a veces respirar, las noche cada ves es mas larga, y el amanecer que no termina de llegar. Vuelvo a dormir, despierto. Miro el reloj y sigue igual. La misma luz enfrente, mis manos igual. Cada ves mas oscuro y mas silencio.
Me estoy quedando solo.
Como molestan estos malditos gusanos.. y la luz! No me deja dormir, ni respirar. Y este café que me mata, y el silencio. Y este sueño que no acaba, esta noche interminable. La incomodidad de mi silla,
y volver a dormir…


carcasco - 02 de Octubre del 2,001

jueves, julio 09, 2009

Programando GreaseMonkey

Soy un adicto a Ikariam, lo acepto. :D

En mi alianza juego con gente de España y Argentina y nos cuesta un poco mantenernos sincronizados para algunas "campañas".

Decidí hacer un pequeño script para que al lado de la fecha pueda poner la fecha de GT y de ARG.

GreaseMonkey es un complemento de Firefox que permite pogramar javascripts adicionales a las paginas que sean actualizados en el browser. Algo asi como... modificar la pagina de cualquier servidor web con funcionalidad javascript programada por nosotros.

El ejemplo que use fue:
El server de Ikariam muestra la hora del servidor en españa. Yo quería modificar la pagina de ikariam para que al lado aparezca la hora de Guatemala y la de Argentina.

Las primeras lineas dan información del script:

// ==UserScript==
// @name HoraArgGua
// @namespace http://carcasco.blogspot.com
// @description Poner varios horarios en el ikariam
// @include http://s6.ikariam.es/index.php*
// ==/UserScript==

Las funciones que puse despues son cosas que solo utilicé de la misma pagina ikariam. Luego mi funcion de cambia de horario.

busco el elemento que quiero cambiar:
servertime = document.getElementById('servertime');

Si existe entonces creo un nuevo elemento:
detalleHoras = document.createElement('span');

Y lo inserto luego de ese. Es decir, agregue un tag de html extra a la pagina:
servertime.parentNode.insertBefore(detalleHoras, servertime.nextSibling);

Adicional hice la funcion que calcula la fecha (puro javascript) y cambio el innerHtml del elemento recién creado.

saludos!

Codigo Completo:
=================


// ==UserScript==
// @name HoraArgGua
// @namespace http://carcasco.blogspot.com
// @description Poner varios horarios en el ikariam
// @include http://s6.ikariam.es/index.php*
// ==/UserScript==

function dezInt(num,size,prefix){prefix=(prefix)?prefix:"0";var minus=(num<0)?"-":"",result=(prefix=="0")?minus:"";num=Math.abs(parseInt(num,10));size-=(""+num).length;for(var i=1;i<=size;i++){result+=""+prefix;}
result+=((prefix!="0")?minus:"")+num;return result;}

function getFormattedDate(timestamp,format){var currTime=new Date();currTime.setTime(timestamp);str=format;str=str.replace('d',dezInt(currTime.getDate(),2));str=str.replace('m',dezInt(currTime.getMonth()+1,2));str=str.replace('Y',currTime.getFullYear());str=str.replace('y',currTime.getFullYear().toString().substr(2,4));str=str.replace('G',currTime.getHours());str=str.replace('H',dezInt(currTime.getHours(),2));str=str.replace('i',dezInt(currTime.getMinutes(),2));str=str.replace('s',dezInt(currTime.getSeconds(),2));return str;}


function cambiarHorario() {
var d = new Date();
d.setMinutes(d.getMinutes()+d.getTimezoneOffset()-6*60);
var strHoraGt = "GT: "+ getFormattedDate(d, 'd/G:i');
d = new Date();
d.setMinutes(d.getMinutes()+d.getTimezoneOffset()-3*60);
var strHoraArg = "AR: "+ getFormattedDate(d, 'd/G:i');
document.getElementById('servertime').nextSibling.innerHTML=" | "+strHoraGt+" | "+strHoraArg;
}

iniciaCambioHorario = function() {
var servertime,detalleHoras;
servertime = document.getElementById('servertime');
if (servertime) {
detalleHoras = document.createElement('span');
detalleHoras.innerHTML="";
servertime.parentNode.insertBefore(detalleHoras, servertime.nextSibling);
}
cambiarHorario();
}

iniciaCambioHorario();

martes, julio 07, 2009

Extraño accidente en Zona 10

Hoy en el edificio hubo un extraño accidente, un carro por error (!!!) entró por las gradas del primer nivel en lugar de entrar por la rampa al parqueo ???!??


Es cierto, yo lo ví.. Al parecer era un señor de edad avanzada y como que se le descompuso el radar :D

viernes, julio 03, 2009

WordPress.com desde Guatemala resuelto

WordPress.com desde Guatemala resuelto

El "fallo" o "bloqueo" que habia mencionado fue corregido.

Que casualidad que 3 empresas distintas tuvieron el msmo fallo al mismo tiempo. :S

saludos!

martes, junio 30, 2009

Bloqueo de Blogs en Guatemala

Desde ayer vengo leyendo varios post relacionados a que en Guatemala estaba siendo bloqueado wordpress... me parecio al principio algo extraño y la verdad no tuve tiempo de revisar el tema.

WordPress es un sitio que al igual que blogspot provee de una herramienta para publicar blogs. Muchas personas en Guatemala lo utilizan como plataforma para publicar sus opiniones, muchas de ellas políticas.

Hoy tratando de leer mis feeds habituales me encuentro con que es verdad!!!! Tuve que salir por un proxy para poder leer los blogs que hablan del tema.

En uno de los blogs que leo hablan de Turbonett, yo ahora estoy navegando desde tigo movil y tambien esta bloqueado?!

Yo no soy de los que apoyan las teorías conspiradoras, pero esto me suena bastante preocupante. Esto es algo que uno podría pensar que estuviera pasando en IRAN o COREA del Norte, o que hubiera pasado hace 25 años.... pero hoy?

No me parece un bug de dns o algo por el estilo, porque no es posible que los distintos proveedores de internet tengan el mismo bug.

Hoy voy a llamar a mi proveedor de internet para exigir que vuelvan a habilitar este portal. Les invito a publicar esta noticia en su blog, en su twitter, en el mensajito de su msn y a llamar a su proveedor de internet para que les expliquen porque tienen bloqueado WordPress.

Adjunto el post escrito en el blog de Javier Gramajo, por si no pueden leerlo. La dirección es esta http://jgramajo.wordpress.com/2009/06/30/bloqueo-de-blogs-en-guatemala/

Bloqueo de Blogs en Guatemala (Javier Gramajo)

Las razones del bloqueo o fallo no las se y en cualquier caso hay que ir dos pasos más allá, mi recomendación es que para lo usuarios de cualquier sistema operativo se instalen TOR, además es muy importante que le expliquen a sus contactos como resolver este problema mandándoles las referencias a manuales que permitan la instalación adecuada y oportunamente.

Como presidente de la Comisión Técnica Intersectorial de Información e Informática del CONCYT estoy haciendo todas las averiguaciones oportunas y de ser necesario haremos un comunicado en relación al bloqueo y el atentado que posiblemente se esté cometiendo a la libre emisión del pensamiento en Guatemala, como ciudadano me preocupa el cierre voluntario pero abrupto de dos blogs o espacios que han sido seguidos por muchas personas FueraColom y PrensaNegra, no califico aqui lo acertado de cada espacio, si no la expresión clara de la democracia que impera o debería imperar en Guatemala, en relación a la libre expresión del pensamiento, libertad que se ha puesto en entredicho al señalar a miembros de la comunidad Bloggers o Twitteros como es el caso de Jean Anelu (carta abierta) o @jeanfer (entrevista).

El uso de las Tecnologías de la Información y las Comunicaciones TICs en Guatemala es de uso intensivo y los distintos indicadores en los que aparece Guatemala no son fiel reflejo de la realidad de un país como Guatemala, el uso de las TICs y las últimas noticias de impacto mundial, las actuaciones y manifestaciones de los últimos meses, ponen de manifiesto a un gran colectivo fundamentado en las TICs y como utiliza un medio trascendental para la búsqueda de una sociedad más equilibrada, desde mi perspectiva todos los sectores deberán poner más atención a uso e impacto que tienen las TICs en la sociedad Guatemalteca de hoy en adelante, si quieren ser coherentes con ese 43% de la población menor de 30 años de este país.

Se están realizando distintas propuestas dentro de la sociedad Guatemalteca quizá una de las más estructuradas sea la de ProReforma propuesta que deberá ser analizada por los distintos colectivos ya existentes y que deberia analizarse para que sea apoyada, no solo por las 70,000 firmas que ha recaudado si no por millones de Guatemaltecos, pero como todo deberá pasar por el consenso de cada Guatemalteco, quizá la única forma de que sea consensuada y validada radique en la utilización de las TICs, dependerá de la estrategia que sigan los que la proponen para social izarla por las redes sociales oportunamente, hay que mencionar que hay cuatro estados en un proceso de validación: Independencia, codependencia, contra dependencia, Interdependencia. No pretendo explicar cada uno pero quizá el más peligroso sea el de contra dependencia que es un estado el que cualquier propuesta será rechazada porque no se origina en el que la rechaza, Guatemala no necesita de personas contra dependientes, independientes (en su sentido negativo) y menos codependientes, necesitamos trabajar de manera interdependiente.

Finalmente muchos de los movimientos que se generarón en los últimos meses en Guatemala, lo cuales han fundamentado su actuar en las TICs, es en esos espacios donde debería calificarse si el movimiento se ha apagado o no, no entiendo como se está calificando la actuación de los distintos colectivos basados en la presencia o protesta física, en primer lugar es necesario un cambio de paradigma de los que participan y aquellos que califican en y a los movimientos, la protesta no está en la calles está en los blogs, en los mensajes, correos, cadenas, redes sociales, etc, y es por ello que es tan peligroso el hecho que hasta el día de hoy no se pueda acceder a los blogs publicados en espacios como wordpress.

Con el bloqueo de los Blogs que residen en wordpress, donde seguramente se generan más del 60% de los blog en Guateamala se están dejando de discutir temas como la Comisión de Postulaciones, el recurso interspuesto por los Rectores (artículo, opinión) de la universidades del país en la Corte de Constitucionalidad (articulo, declaraciones) así que sea fallo o bloqueo existen herramientas que permiten evadir cualquier de los anteriores, no quiero dejar de terminar sin recomendar a todos aquellos estudiantes o profesionales del sector TICs en Guatemala a que jamas utilicen su conocimiento para atentar contra la derechos fundamentales de cualquier individuo y ciudadano de un país.

Relacionados con el tema:

1.Carpe Diem

2.Guatemala Drummer

3.Maestros de la Web

4. Artículo: Prensa Libre se expresan en la web

5. ALT1040: Guatemala Bloquea acceso a WordPress


miércoles, mayo 27, 2009

Oracle busquedas like (fuzzy, contains, soundex)

Necesito hacer una busqueda por nombres, pero quiero que el sistema me diga si hay un nombre "parecido" en el sistema. Es decir, quiero buscar un cliente llamado Carlos Castañeda pero en la base de datos tengo varios similares, aunque ninguno igual:
Juan Carlos Castañeda
Carlos Castañeda Perez
Carlos Castaneda

La verdad estuve divagando bastante en el tema y no lograba encontrar el camino correcto.

Lo primero que busqué fue la funcion Soundex. Soundex es un algoritmo que hace equivalencias foneticas de 2 palabras. Por ejemplo ait con eight. Cada palabra tiene un valor soundex y si los valores son iguales, entonces, tengo un acierto.
select soundex('eigt'), soundex('eight') from dual
Ambos registros me devuelven E230 por lo que deben ser equivalentes.

Pero.... este algoritmo solo funciona en ingles. No para español.

Seguí buscando y encontre un blog con una implementacion plsql del soundex: http://oraclenotepad.blogspot.com/2008/03/soundex-en-espaol.html

Pero el soundex me compara solamente una palabra y yo quería comparar 2 nombres completos. Modifiqué un poco el codigo e hize una funcion que sacaba el soundex de cada palabra del nombre_a_buscar en el campo_nombre y si cumplía mas del N porciento entonces devolvía ok. Estaba bien, pero...

el performance se fue al suelo cuando quería buscar en una tabla con mas de medio millon de registros.

De dedique entonces a buscar la funcion CONTAINS de Oracle. Esta funcion me permite buscar en textos grandes. Separa las palabras de un texto y las indexa. Hay que crear un indice para utilizarla:

create index clientes_idx on temp (nombre) indextype;

ya ahi podía hacer consultas:
SELECT score(1),nombre FROM clientesWHERE CONTAINS (nombre, 'castañeda',1) > 0;

El contains devuelve un score con el que se evalúa el resultado. Mientras mas alto sea el resultado es mas exacta la busqueda.

Cuando busco con 2 nombres, este query me devuelve los resultados que tengan los 2 nombres, por ejemplo juan Carlos Castañeda o Carlos Castañeda Perez
SELECT score(1),nombre FROM clientesWHERE CONTAINS (nombre, 'carlos castañeda',1) > 0;

pero... no me devuelve nombres como Carlos Alberto Castañeda Perez.

agregué un OR a la consulta
SELECT score(1),nombre FROM clientesWHERE CONTAINS (nombre, 'carlos or castañeda',1) > 0;
pero... me devuelve todos los carlos y todos los castañedas. Carlos Perez, Carlos Lopez, Juan Castañeda, Carlos Castañeda, etc.

Cambié la consulta a un AND y mejoró
SELECT score(1),nombre FROM clientesWHERE CONTAINS (nombre, 'carlos or castañeda',1) > 0;

Pero me posicionaba de igual manera el Carlos Castañeda del Carlos Jose Castañeda y del Carlos Castañeda Perez.

Necesitaba diferenciar las busquedas exactas.

Busque entonces:
SELECT score(1),nombre FROM clientesWHERE CONTAINS (nombre, 'carlos or castañeda or (carlos and castaneda)',1) > 0;

El query se empezaba a complicar un poco. Además estaba buscando tambien que me diera busquedas Fuzzy, es decir, busquedas que me devolvieran palabras que contienen "casi" todos los caracteres de la palabra a buscar.

en ese caso debía buscar
SELECT score(1),nombre FROM clientesWHERE CONTAINS (nombre, '?carlos or ?castañeda',1) > 0;

Encontré también algo que no había utilizado que es el "query template" que me permitiría tener un query un poco más sencillo, con esto deje mi query así:










Lo que hace la plantilla es partir la cadena que envio en textquery como si fuesen varios tokens, y además va evaluando progresivamente cada una de las opciones que le envío. Es decir, primero busca con AND para ver si estan todas las palabras:
transform((TOKENS, "{", "}", "AND"))

Luego busco con AND pero con palabras "fuzzy" o parecidas, añadiendo el "?"
transform((TOKENS, "?{", "}", "AND"))

Si quisiera que hiciera un soundex pondria un "!" antes del token. Pero el soundex es en ingles y no me sirve.
transform((TOKENS, "!{", "}", "AND"))

Luego hago lo mismo pero con OR para que busque alguna de las 2 palabras.

pero...
también estuve leyendo que el query no estaba sincronizado por default, habría que sincronizarlo.
begin
CTX_DDL.SYNC_INDEX('clientes_idx','50K');
end;
/

pero.. yo no quería sincronizarlo cada ves que ejecuto el query... así que cambie el indice para que se sincronice al hacer commit:

create index clientes_idx on temp (nombre) indextype is ctxsys.context parameters('sync (on commit)');

ahora sí, cuando quise buscar CASTANEDA o JOSE en lugar de josé no me devolvia los mismo valores. Consideras las tildes como caracteres distintos.

Encontre que el indice hay que indicarle que utilice un LEXER_BASIC.

Para esto me conecte como sys y me di grants: grant execute on CTX_DDL to scott;

ya en mi esquema, creé una preferencia con el LEXER que necesito:
begin
CTX_DDL.CREATE_PREFERENCE ('LEXER_SINTILDES', 'BASIC_LEXER');
CTX_DDL.SET_ATTRIBUTE ('LEXER_SINTILDES', 'BASE_LETTER', 'YES');
end;
/

recreé el indice:

create index temp_nombre_idx on temp (nom_contacto) indextype is ctxsys.context parameters('sync (on commit) LEXER LEXER_SINTILDES');

Con eso ya logré los resultados que esperaba. mmm... no del todo. No encontré un soundex que me diera mejores resultados sin sacrificar el performance. Pero tengo buenos resultados.

saludos!
Algunos de los links que leí... solo algunos:

http://hugoracle.blogspot.com/2008/07/mejora-de-desempeo-con-oracle-text.html
http://www.orafaq.com/forum/t/95509/2/
http://www.oracle.com/technology/products/text/pdf/10gtext_features_overview.pdf
http://www.oracle.com/technology/products/text/htdocs/prog_relax.html?_template=/ocom/print

martes, mayo 19, 2009

WSWS3549E: Error: WSDL2Java could not discover a suitable StubWriter for null.

Estabamos creando un cliente de webservice en Rational Web Developer 6.0.
El servicio estaba hecho en visual basic o .net
Cuando tratabamos de consumirlo recibimos un error de WSWS3549E: Error: WSDL2Java could not discover a suitable StubWriter for null.

Buscando un poco en la red, encontre que el problema es que RWD6.0 no utiliza soap 1.2 y por eso no me dejaba crear el cliente.

Encontré 3 posibles soluciones:
llamar a los desarrolladores del servicio y pedir que lo publiquen sin soporte soap 1.2, esto cambiando el web.config agregando estas lineas. Con esto logre crear el cliente correctamente.






Crear el cliente usando Axis, ahi logré utilizar el servicio.











Modificar "a mano" los wsdl quitando las llamadas a soap 1.2













Hasta ahí todo bien... pero... mas cosas pasaron en esa implementación....

Ref. http://www.ibm.com/developerworks/forums/thread.jspa?threadID=113283&tstart=30

continuará.-

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!