Seleccionar página

Durante su funcionamiento, Seam lanza una serie de eventos predefinidos al realizar ciertas.
Estos eventos pueden ser escuchados por nuestra aplicación y actuar en consecuencia.
Algunos eventos interesantes son:

  • org.jboss.seam.validationFailed : Se lanza cuando hay un fallo de validación
  • org.jboss.seam.postCreate.<name> : Se lanza cuando el componente con nombre <name> se instancia. Se puede usar de forma similar a la anotación @Create de los EJBs
  • org.jboss.seam.exceptionNotHandled : Se lanza cuando salta una excepción que no es manejada por Seam.
  • org.jboss.seam.beforePhase y org.jboss.seam.afterPhase : Se lanzan respectivamente antes del inicio y después del final de cada fase JSF. Este evento es lanzado con el parámetro PhaseEvent, que indica la fase que empieza/acaba

La lista completa de eventos puede verse en el manual

Para escuchar eventos en Seam debemos usar la anotación @Observe para anotar un método que se ejecutará en respuesta al evento. Este método deber ser siempre público y, en el caso de los eventos predefinidos, sin argumentos (con alguna excepcion).
Hay que tener en cuenta que estos métodos se ejecutan en el mismo hilo que la traza principal, de forma que hasta que no terminen de ejecutarse la aplicación no continuará, por lo que hay que tener cuidado.
[java]
@Observe(“nombre-del-evento”)
public void metodoEscuchador() {
// do domething
}
[/java]

Pero aparte de los eventos predefinidos, también podemos lanzar y escuchar nuestros propios eventos.
Disponemos de varias formas de lanzar nuestros eventos personalizados:

  • Etiqueta @RaiseEvent
    Al ejecutar un método anotado con la etiqueta @RaiseEvent, se lanzará el evento indicado
    [java]
    @RaiseEvent(“venta-confirmada”)
    public String confirmarVenta(int idVenta) {
    // cuerpo del metodo
    }
    [/java]
  • Fichero de navegación pages.xml
    Puedes lanzar un evento mediante la etiqueta <raise-event>
    [xml]

    [/xml]

  • Mediante el componente Events
    Este componente permite lanzar eventos síncronos o asíncronos de manera programática.
    Los eventos lanzados de forma asíncrona se ejecutan en un hilo paralelo, por lo que son ideales para tareas pesadas o susceptibles de fallo que no deberían afectar al resto del sistema, como envío de emails, estadísticas…

    Las ventajas de usar esta manera de lanzar eventos es que, aparte de poder lanzar eventos asíncronos, se pueden añadir parámetros al evento, que serán pasados como argumentos a la función que los observe en el orden en el que se añaden. Por ello, la función observadora debe tener como máximo el mismo número de argumentos de los que se envían al lanzar el evento, y siempre el mismo tipo.
    También permite lanzar eventos al cabo de un determinado tiempo o lanzarlos al final de la transacción en curso.

    Aquí vemos un ejemplo que ejecuta un método a través de eventos cada vez que se confirma una venta.
    [java]
    public String confirmarVenta(int idVenta) {
    Events.instance().raiseEvent(“venta-confirmada”, idVenta);
    }

    @Observe(“venta-confirmada”)
    public void observarVentaConfirmada(int idVenta) {
    // do domething
    }
    [/java]
    También podemos optar por lanzar el evento de forma asíncrona y/o añadir más parámetros al evento, los cuales serán ignorado por las funciones observadoras con menor numero de argumentos
    [java]
    public String confirmarVenta(int idVenta) {
    Events.instance().raiseEvent(“venta-confirmada”, idVenta, idVendedor);
    }

    @Observe(“venta-confirmada”)
    public void registraVenta(int idVenta) {
    // solo nos interesa el identificador de venta
    }

    @Observe(“venta-confirmada”)
    public String otorgaComisionAlVendedor(int idVenta, int idVendedor) {
    // Obtenemos ambos parámetros
    }
    [/java]

Share