Coste de Envio de mensajes de Log
Cuando desarrollamos una aplicación, muchas veces nos planteamos donde
debemos escribir la información de log.
Si mostramos mensajes por la consola estandar (por pantalla)…… es cómodo pero es muy
lento (aunque siempre podemos redirigir la salida a un fichero)
Podemos tomar la decisión de escribirlos en un fichero local.…. el
problema puede ser, ¿quien limpia luego esos ficheros?. Si trabajamos en
entornos serios, las herramientas de monitorización y backup pueden hacer este
trabajo por nosotros … pero no nos podemos despistar.
Podemos decidir enviar los mensajes a otra máquina y que esta sea quien los
guarde. Si decidimos hacelo via TCP, debemos tener cuidado con controlar bien
esta comunicación porque sería una pena que, porque fallase el sistema de Log,
se parase nuestra aplicación.
Si usamos UDP (comunicaciones ni orientadas a conexion), tenemos que tener en
cuenta que que los paquetes no estan garantizados que lleguen.
Otra posibilidad, es utilizar JMS, es decir, mensajería …. y
luego procesar esos mensajes cuando deseemos.
Pero ¿alguna vez os habeis parado a pensar los que cuesta escribir cada uno
de los mensajes por distintos medios?
Os vamos a mostrar distintos ejemplos para que tengais una referencia.
Mensajes por pantalla y en fichero
|
Si ejecutamos este código … la respuesta que optenemos es
|
Es decir, ha costado 25 veces más escribir en pantalla que en disco.
Escritura UDP
Si creamos un pequeño programa cliente UDP (que envia los mensajes de Log)
.. y un servidor …… tenemos que estar seguros de los que estamos haciendo
…
Programa cliente
|
Si lo ejecutamos nos dice
El tiempo transcurrido es 1232 milisegundos
Y ahora el servidor
|
Pero si vemos la consola del servidor … se nos estan perdiendo datos
Posiblemente … estemos mandandolos muy rápido
Si ahora modificamos un poco nuestro código y ponemos un retardo … podemos
ver que no se pierden datos
|
Como conclusión, podemos decir que …. si se generan
demasiados mensajes …. y los mandamos todos seguidos ….. se perderán
paquetes … así que tenemos que ser habiles y utilizar mecanismos un poco más
elaborados para asegurarnos de no perder datos.
Envio de mensajes a través de JMS
JMS es un interfaz para interactuar con proveedores de servicio
de mensajería (bueno… más o menos)
Nosotros podemos crear un programa cliente que se conecte a una
cola de mensajes y enviar nuestra información.
Una de las ventajas que puede presentarnos este sistema es que
el gestor de colas podría ser cualquier cosa …… de tan modo que se nos
puede proporcionar de un modo transparente capacidad de persistencia,
transaccionalidad, backup, politicas de enrutamiento …etc.
Nosotros vamos ha hacer un pequeño programa que se conecte a
una cola que hemos creado en el servidor de aplicaciones J2EE de Sun (versión
1.3.1). Tengo que decir que me he vuelto loco intentando hacer funcionar este
ejemplo en la versión 1.4 (con pequeños cambios siguiendo de tutorial de Sun) ….. por lo que al final he desistido y seguido las
recomendaciones de muchos foros de (obviamente esto no es un proyecto vital) usando la 1.3.
Os vamos a mostrar todos los pasos (que son muy sencillos)
-
Nos descargamos el software J2EE de sun (y lo
instalamos)
-
Ponemos las variables de entorno
![]() |
![]() |
- Arrancamos el servidor escribiendo
j2ee -verbose
- Creamos la cola escribiendo
j2eeadmin -addJmsFactory ColaRoberto queue
Escribimos el código que manda los mensajes
|
Ahora el código del cliente (que se diferencia muy poquito del anterior)
|
Si usais NetBeans (o cualquier otro entorno gráfico) aseguraos que
encuentra el fichero j2ee.jar
Si arrancamos ahora nuestro programa para enviar mensajes a la cola
|
El tiempo es un pelín alto.. aunque puede deberse a distintas cosas (como el
lookup de nombre de máquina)
Si paramos el servidor de aplicaciones
Y lo volvemos a arrancar ….. y lanzamos el programa que lee mensajes de la
cola … los mensajes siguen
Mensaje: Creamos un contexto Mensaje: Buscamos la factoria Mensaje: Buscamos la cola Mensaje: Creamos la conexion Java(TM) Message Service 1.0.2 Reference Implementation (build b14) Mensaje: Creamos la sesion Mensaje: Creamos el Receptor de Mensajes Mensaje: Arrancamos la conexion Mensaje: Leemos el mensajes Mensaje: El mensaje recibido es Nuevo mensaje Sat Aug 23 10:38:54 CEST 2003 Mensaje: Cerramos el lector |
Hay un linea que marcamos en el programa enviador de mensajes
mensaje.setStringProperty(«TipoMensaje»,
«1»);
Una de las gracias que tiene el uso de JMS, es que te permite
conectar un programa cliente y filtrar solo los mensajes que deseas …..
Si modificamos un poquito el programa receptor (ojo que ahora
leemos 1000 mensajes) .. podemos establecer el filtro a través de propiedades,
con una sintaxis parecida a la de SQL
|
Como conclusión …. la utilización de colas de mensajes….. penalizando
en tiempo … nos proporciona mayores garantias de entrga y mejores capacidades
de gestión, desacomplando la generación y la captura..
Conclusión General
En función del tipo de aplicación …. debemos decidir cual es el sistema
que más nos interesa
… aunque con este ejemplo si hemos ganado algo claro …. la posibilidad de
tener ejemplos a mano, para hacer nuestras propias pruebas.
Siguiendo el tutorial, en la parte que ejecuto la linea de comandos \\\»j2ee -verbose\\\» me da el siguiente fallo:
ERROR: Set JAVA_HOME to the path of a valid jdk.
Donde tendria que tener instalada la jdk??
Algo me puede ayudar, Gracias
amigo esa aplicacion puede enviar vensajes masivos cargados de na base de datos o de excel