Estas en:

Catálogo de servicios
Autentia (PDF 6,2MB)

tríptico de Autentia
En formato comic...

Acceso de usuarios registrados:

Deseo registrarme

He olvidado mis datos de acceso

Registra tu empresa:

Descubre las ventajas de registrar tu empresa en AdictosAlTrabajo...

Registrar mi empresa

Listado de empresas ya registradas

Google

Últimos tutoriales

+Noticias Destacadas

+Comentarios Cómic

  2009-08-28 - 11:17:42 AM
   rcanales escribío:
    Completamente de acuerdo contigo. Yo no se quien hace las cuentas en tu empresa [...]
  2009-08-28 - 07:01:44 AM
   Anonimo escribío:
    pues yo tengo el cuello rigido como una piedra porque el aire acondicionado esta [...]
  2009-07-23 - 10:32:12 PM
   Jaime escribío:
    definitivamente la parte mas divertida es la de programar, y la explotacion lo v [...]
  2009-05-13 - 11:26:33 PM
   williarim escribío:
    Quiero felicitar al autor de estas historietas! Gracias por compartir con todos [...]
  2009-05-13 - 04:40:59 PM
   rcanales escribío:
    Hola Brunoise: Todo tiene perspectiva. El función de tus forma de ser y ver e [...]

+Enlaces


Tutorial desarrollado por

Roberto Canales Mora

Creador y propietario de AdictosAlTrabajo.com, Director General de Autentia S.L., Ingeniero Técnico de Telecomunicaciones y Executive MBA por el Instituto de Empresa 2007. Perfíl Technorati

Experto en formación en: Dirección de proyectos informáticos, análisis y diseño UML, arquitectura Web, patrones de diseño y JEE a todos los niveles.

Puedes consultar mi CV y alguna de mis primeras aplicaciones (de los 90) aquí

Catálogo de servicios de Autentia

Descargar (6,2 MB)

Descargar en versión comic (17 MB)

AdictosAlTrabajo.com es el Web de difusión de conocimiento de Autentia.

Catálogo de cursos

Fecha de creación del tutorial: 2004-07-02

Temporizar tareas en Java

Análisis de disponibilidad de un Web

Cuando somos responsables de un Web empresarial, debemos cuidar el nivel de servicio que proporcionamos a nuestros clientes. Normalmente se da la circunstancia de que cuando se cae nuestro Web nos enteramos por una protesta de un cliente o un usuario de negocio.

Hay veces que contratamos un Hosting y llegamos a un acuerdo de nivel de servicio (SLA). Más habitualmente de lo que me gustaría poder contar, estos niveles de servicio no se respetan.

Debemos tener la capacidad de medir estos servicios por nuestros propios medios. Hace no mucho, os mostrábamos un tutorial sobre una herramienta profesional que cubre de sobra esta funcionalidad, llamada e-test (Rendimiento de aplicaciones Web).

A mi personalmente me gusta tener la capacidad de verificar por mis propios medios (y desde mi casa con ADSL) si el sistema funciona bien o mal. Os recomiendo una herramienta llamada WebSupervisor, que puede cubrir esta funcionalidad.

Si sabéis un poco de Java, es bastante sencillo construir un pequeño programa para este propósito... y con algún valor añadido.

Vamos a empezar a hacerlo paso a paso. El objetivo es construir el esqueleto de lo que podrá ser una herramienta de monitorización y mostrar algunas notas para poder darle continuidad.

Creación de la funcionalidad básica

Creamos un nuevo proyecto en NetBeans 3.6

Debemos ser consciente que el interfaz de usuario es lo menos importante a la hora de diseñar un programa. Debemos intentar acotar la funcionalidad y hacerla independiente de como sea invocada.

 public String EjecutarTarea() {
        
       try
       {
           // inicializamos el destino si es necesario
           if(destino == null)
           {
             destino = new URL("http://www.adictosaltrabajo.com/");
           }
           
           // abrimos la conexión al servidor 
           HttpURLConnection enlace = (HttpURLConnection)destino.openConnection();
           String respuesta = " - Codigo:  " + enlace.getResponseCode();

           //respuesta += recuperaContenido(enlace);
                    
           return respuesta;
           
       }
       catch(Exception e)
       {
            return "Error " + e.getMessage() + "\n";
       }
        
    }
    
    // esta función recupera el texto de la página
    String recuperaContenido(HttpURLConnection enlace)
    {
      try
       {
           String respuesta = "";
           BufferedReader in = new BufferedReader (new InputStreamReader(enlace.getInputStream()));

           String cadena = "";

	   while (cadena != null)
	   {
		cadena = in.readLine();
		if (cadena != null)
		{
                	respuesta+=("\n" + cadena);
		}
            }
           
           in.close();
           return respuesta;
           
       }
       catch(Exception e)
       {
            return "Error " + e.getMessage() + "\n";
       }
    }

Con la función anterior, tenemos la capacidad de conectarnos a una URL y recuperar el código de retorno, e incluso recuperar el contenido de la página (//respuesta += recuperaContenido(enlace);)

El diseño inicial no es muy bueno así que tenedlo en cuenta en vuestros desarrollos (esto solo es un tutorial parcial) :

  • La URL esta fija y dentro del código
  • No se gestionan ni propagan excepciones

Temporizar una función

Java dispone de una clase para planificar la ejecución de una función de un modo periódico, sin bajar al detalle de los hilos (Threads) Timer

 public void Arrancar() 
    {
        
    java.util.Timer timer = new java.util.Timer();
    
    	// creamos una clase inline
    	timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                String resultado = EjecutarTarea();
                AddTexto("" + new Date().toString() + resultado );
           }
        }, retardo, periodo);   
    }

 

Creación del Interfaz de Usuario

Usando las capacidades de NetBeans, vamos a crear un interfaz sencillo

NetBeans es un entorno bastante intuitivo, aunque puede costar un poco cogerle el tacto...

Como primera aproximación podemos obtener el siguiente código

/*
 * Temporizador.java
 *
 * 1 Julio, 2004
 * El objetivo de este programa es comprobar el estado de una página Web
 * 
 * Es un ejemplo parcial ...
 */
import java.util.*;
import javax.swing.*;
import java.net.*;
import java.io.*;

/**
 *
 * @author  Roberto Canales
 */
public class Temporizador extends javax.swing.JFrame {
    
    /** Creates new form Temporizador */
    public Temporizador() {
        initComponents();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem2 = new javax.swing.JMenuItem();
        jMenuItem1 = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Ejemplo de Temporizador");
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jTextArea1.setPreferredSize(new java.awt.Dimension(640, 480));
        jScrollPane1.setViewportView(jTextArea1);

        getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);

        jMenu1.setText("Menu");
        jMenu1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenu1ActionPerformed(evt);
            }
        });

        jMenuItem2.setText("Arrancar");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem2ActionPerformed(evt);
            }
        });

        jMenu1.add(jMenuItem2);

        jMenuItem1.setText("Salir");
        jMenuItem1.setToolTipText("Menu principal");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });

        jMenu1.add(jMenuItem1);

        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        pack();
    }

    private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        Arrancar();
    }

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
       dispose();
    }

    private void jMenu1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
    }
    
    /** Exit the Application */
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        new Temporizador().show();
    }
    
    // la función Arrancar simplemente crea un temporizador 
    // y ejecuta una función periódicamente
    public void Arrancar() 
    {
     jMenuItem2.setEnabled(false);
        
    java.util.Timer timer = new java.util.Timer();
    
    // creamos una clase inline
    timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                String resultado = EjecutarTarea();
                AddTexto("" + new Date().toString() + resultado );
           }
        }, retardo, periodo);
   }
    
    // la tarea a ejecutar es independiente del interfaz de usuario
    public String EjecutarTarea() {
        
       try
       {
           // inicializamos el destino si es necesario
           if(destino == null)
           {
             destino = new URL("http://www.adictosaltrabajo.com/avisos");
           }
           
           // abrimos la conexión al servidor 
           HttpURLConnection enlace = (HttpURLConnection)destino.openConnection();
           String respuesta = " - Codigo:  " + enlace.getResponseCode();

           //respuesta += recuperaContenido(enlace);
                    
           return respuesta;
           
       }
       catch(Exception e)
       {
            return "Error " + e.getMessage() + "\n";
       }
        
    }
    
    // esta función recupera el texto de la página
    String recuperaContenido(HttpURLConnection enlace)
    {
      try
       {
           String respuesta = "";
           BufferedReader in = new BufferedReader (new InputStreamReader(enlace.getInputStream()));

           String cadena = "";

	   while (cadena != null)
	   {
		cadena = in.readLine();
		if (cadena != null)
		{
                	respuesta+=("\n" + cadena);
		}
            }
           
           in.close();
           return respuesta;
           
       }
       catch(Exception e)
       {
            return "Error " + e.getMessage() + "\n";
       }
    }
    
    // añadimos texto al componente en pantalla
    public void AddTexto(java.lang.String nodo) {
       jTextArea1.append(nodo + "\n");
    }
    
    // Variables declaration - do not modify
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    // End of variables declaration
    
    // inicializamos las variables no gestionadas por el compilador NetBeans 3.6
    private URL destino = null;

    private int retardo = 0;   // no esperar
    private int periodo =  2 * 60 * 1000;  // ejecutar cada 5 minutos    
}

Ejecución

Si ejecutamos el programa, obtenemos la siguiente respuesta... Nuestro Hosting de www.adictosaltrabajo.com es bastante estable.

 

Otros usos adicionales

Si somos un poco hábiles, podemos determinar las dependencias de nuestro sistema Web a otros subsistemas y crear un pequeño JSP/PHP/ASP que sea capaz de probar si tenemos acceso a ellos:

  • LDAP
  • Base de Datos
  • Host transaccional
  • Servidor de Aplicaciones
  • Sistema remoto de ficheros
  • Middleware
  • etc...

Podríamos también modificar nuestro programa para que, al encontrar un error en la página probada, recorriendo cada una de las rutinas que prueban cada subsistema individualmente, analizase quién lo está produciendo.

De este modo, cuando se produzca un problema en producción, desde vuestra casa podréis prever errores (siempre y cuando lo que falle no sea el propio servidor Web).

Con un sistema de estas características (que se puede desarrollar en día) podéis tanto medir la estabilidad del sistema como adelantaros a la llamada del usuario de negocio cabreado porque la aplicación, en medio de una demo, lleva media hora sin funcionar. Además, si cuando se produce un error, mandáis un email a una pasarela SMS, te enterarás sin tener que estar atento al correo.

Otra mejora puede consistir en monitorizar al mismo tiempo un Web muy estable (como google) y solo considerar los datos como válidos cuando esté último de una respuesta correcta ....  ya que sería una pena que lo que fallase fuera nuestra configuración local ;-))

  • Enlace ADSL
  • Red Inalámbrica
  • Configuración TCP/IP
  • Desconexión de algún cable (que pasa muy habitualmente)

Conclusiones

Muchos sabréis que hay un montón de causas por las que fallan las aplicaciones y normalmente es por falta de procedimientos organizativos a la hora de operar sistemas:

  • Lagunas de memoria en programas (normalmente construidos por nosostros).
  • Cambios de contraseñas en un turno que se aplican al rea-rrancar en otro.
  • Caducidad de certificados digitales.
  • Modificaciones aparentemente inocuas del LDAP.
  • Llenado de los discos o espacio de tablas de base de datos.
  • Borrado accidental de ficheros/campos.
  • Falta de pruebas automáticas de regresión funcional
  • Y un largo etc .....

Ampliando este ejemplo un poquito, las posibilidades son interesantes:

  • Obtener una gráfica de disponibilidad
  • Enviar un correo electrónico cuando el código de retorno la petición cambie
  • Analizar el contenido HTML para verificar que no cambia... o es sustituido (nos han jaqueado)
  • Asegurarnos que nuestras fuentes de contenido (sindicado o alimentado por autores) funcionan correctamente

Determinar la disponibilidad, rendimiento y capacidad de los sistemas, requiere de práctica y técnica.

Adquirir una herramienta puede ser muchas veces más interesante que construirla aunque puede ser un negocio rentable (o un buen proyecto de fin de carrera con salida comercial) para la demanda creciente de estos servicios .....

Sobre el Autor ..

¿Qué te ha parecido el tutorial? Déjanos saber tu opinión y ¡vota!

Muy malo Malo Regular Bueno Muy bueno
 


(Sólo para usuarios registrados)

» Registrate y accede a esta y otras ventajas «

Anímate y coméntanos lo que pienses sobre este tutorial

Puedes opinar o comentar cualquier sugerencia que quieras comunicarnos sobre este tutorial; con tu ayuda, podemos ofrecerte un mejor servicio.


(Sólo para usuarios registrados)

» Registrate y accede a esta y otras ventajas «

Autor Mensaje de usuario registrado

Creative Commons License Esta obra está licenciada bajo licencia Creative Commons de Reconocimiento-No comercial-Sin obras derivadas 2.5

Recuerda

Autentia te regala la mayoría del conocimiento aquí compartido (Ver todos los tutoriales). Somos expertos en: J2EE, Struts, JSF, C++, OOP, UML, UP, Patrones de diseño ... y muchas otras cosas.

¿Nos vas a tener en cuenta cuando necesites consultoría o formación en tu empresa?, ¿Vas a ser tan generoso con nosotros como lo tratamos de ser con vosotros?

Somos pocos, somos buenos, estamos motivados y nos gusta lo que hacemos ...

Autentia = Soporte a Desarrollo & Formación.

info@autentia.com

Tutoriales recomendados

Nombre Resumen
Fecha
Visitas Valoración Votos Pdf
Analizando la calidad del código Java con Sonar En este tutorial vamos a dar a conocer la herramienta Sonar para el control de la calidad del código de nuestros proyectos 2009-12-07 1597 - -
Spring AOP: Cacheando aplicaciones usando anotaciones y aspectos con Aspectj Ejemplo de implementación de un sistema de cache basado en anotaciones y aspectos con Aspectj 2009-04-24 3842 Muy bueno 1
OSCache: Sistema de caché para aplicaciones Java En este tutorial, aprenderemos a usar OSCache como sistema de cache para aplicaciones Java 2009-01-02 2841 - -
JMeter: Tests de rendimiento usando varios clientes distribuidos En este tutorial, aprenderemos a configurar JMeter para realizar pruebas de estres usando varios clientes distribuidos 2008-12-27 4483 - -
Análisis de rendimiento al usar un Pool de conexiones Análisis de rendimiento de usar o no un pool de conexiones a bases de datos en nuestras aplicaciones 2008-12-25 3866 - -
Cobertura: Como comprobar cuanto código prueban nuestros test Cobertura es una herramienta libre (GPL) escrita en Java, que nos permite comprobar el porcentaje de código al que accedemos desde los test. Es decir, Cobertura nos permite saber cuanto código estamos realmente probando con nuestros test. 2008-10-18 5445 - -
¿Cómo cambiar el nivel de log en tiempo de ejecución? En este tutorial Carlos nos va a mostrar como cambiar el nivel de log de una aplicación en tiempo de ejecución. 2008-07-17 3150 - -
Slimming básico de JBoss En este tutorial se muestra un ejemplo concreto y sencillo de mejora en el tiempo de arranque de JBoss 2008-02-07 3141 - -
Monitorización y profiling de aplicaciones java con VisualVM En este tutorial os presentamos VisualVM, una herramienta que, de forma gráfica, va a permitirnos monitorizar la máquina virtual que estemos utilizando así como los distintos procesos java que estemos ejecutando sobre ella. 2008-01-13 4066 - -
Como acelerar una conexión VPN muy lenta En este tutorial vamos a ver como se puede acelerar un túnel VPN para poder conectarse desde casa a la oficina de una forma segura 2007-06-25 6476 - -

Nota:

Los tutoriales mostrados en este Web tienen como objetivo la difusión del conocimiento. Los contenidos y comentarios de los tutoriales son responsabilidad de sus respectivos autores. En algún caso se puede hacer referencia a marcas o nombres cuya propiedad y derechos es de sus respectivos dueños. Si algún afectado desea que incorporemos alguna reseña específica, no tiene más que solicitarlo. Si alguien encuentra algún problema con la información publicada en este Web, rogamos que informe al administrador rcanales@adictosaltrabajo.com para su resolución.