mvc - Los eventos CDI observados en toda la sesión abarcaron los beans de respaldo de JSF
jsf primefaces (2)
Me pregunto si es posible observar un evento CDI con múltiples beans de respaldo con ámbito de sesión JSF 2.0. Pensé que podía enviar eventos / datos a múltiples sesiones observando el evento.
Configuré una pequeña prueba que permite al usuario disparar el evento usando un botón en la página (que está vinculado a un método en el bean de respaldo con ámbito de sesión que en realidad dispara el evento). Pensé que si abría dos navegadores diferentes, se crearían dos sesiones y el evento notificaría a cada uno de los beans de respaldo de la sesión.
Sin embargo, cuando ejecuto mi pequeña prueba y hago clic en el botón para iniciar el evento en uno de los navegadores, veo que el evento solo notifica a uno de los beans de ámbito de la sesión. Solo notifica al bean desde el que se activó el evento (es decir, si hago clic en el botón del navegador 1 se notifica a la sesión bean backing de la sesión en el navegador 1 y si hago clic en el botón del navegador 2 el bean respalda la sesión el navegador 2 es notificado).
Tenía la impresión de que los eventos notificarían todas las instancias de beans. Sin embargo, este no parece ser el caso. Debería ser capaz de hacer esto? ¿Tengo algo mal configurado?
ACTUALIZAR para mostrar cómo se ve mi código:
Un fragmento de jsfpage.xhtml para activar un evento y mostrar los datos del ámbito de la sesión:
<h:form> <h:outputText value="#{BackingBean.property}" /> <p:commandButton value="Fire Event" action="#{EventFirer.fireEvent}" /> </h:form>
El bean con ámbito de sesión que recibe el evento:
@Named @SessionScoped public class BackingBean implements Serializable { private String property; public String getProperty() { return property } public void listenForChange(@Observes EventObj event) { logger.log(Level.INFO, "Event received"); property = event.toString(); } }
Una aplicación con alcance de frijol para activar el evento:
@Named @ApplicationScoped public class EventFirer implements Serializable { @Inject private Event events; public String fireEvent() { logger.log(Level.INFO, "Event fired"); events.fire(new EventObj()); return null; } }
He descubierto que todos los observadores registrados son despedidos.
Lo más notable es que si tengo un observador en un Bean de Conversation Scoped y ese bean no está activo en la Conversación actual, cuando se dispara el evento, se crea una nueva instancia especialmente para recibirlo.
Primero, mejor especifique el tipo de evento:
@Inject
private Event<EventObj> events;
Aparte de eso, no hay ninguna indicación en la especificación que limite las instancias del frijol en las que se invoca el método del observador. Me gustaría presentar un problema al respecto (en el rastreador de errores de la implementación que está utilizando. ¿Quizás Weld?)