2010-12-19 5 views
8

Мне интересно, можно ли наблюдать событие CDI с несколькими поддерживающими бэкэндом JSF 2.0. Я подумал, что могу передать события/данные на несколько сеансов, наблюдая за событием.Происходит ли событие CDI во всех поддерживаемых боковых компонентах JSF в сессионном режиме

Я установил небольшой тест, который позволяет пользователю запускать событие с помощью кнопки на странице (которая привязана к методу в компоненте, поддерживающем сеанс, который фактически запускает событие). Я думал, что если я открою два разных браузера, будут созданы две сессии, и событие будет уведомлять каждую из сторонних бэкэндов.

Однако при запуске моего маленького теста и нажатии кнопки, чтобы запустить событие в одном из браузеров, я вижу, что событие только уведомляет одну из фаз, охваченных сеансом. Он уведомляет только о компоненте, из которого было вызвано событие (т. Е. Если я нажму кнопку в браузере 1, будет активирован сеансовый компонент, поддерживающий сеанс в браузере 1, и если я нажму кнопку в браузере 2, компонент, поддерживающий сеанс в браузер 2 уведомляется).

У меня создалось впечатление, что события будут уведомлять все экземпляры bean. Однако, похоже, это не так. Должен ли я это сделать? У меня что-то неправильно настроено?

UPDATE, чтобы показать, что мой код выглядит следующим образом:

фрагмент jsfpage.xhtml стрелять событие и показать контекст сеанса данные:

 <h:form> 
      <h:outputText value="#{BackingBean.property}" /> 
      <p:commandButton value="Fire Event" action="#{EventFirer.fireEvent}" /> 
     </h:form> 

Сессия , который принимает событие:

 
@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(); 
    } 
} 

Применение области действия боб активаций события:

 
@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; 
    } 
} 
+0

Вы должны добавить свой код, капитан. –

+0

Вы когда-нибудь находили решение? Я пытаюсь сделать то же самое и хочу переместить данные во все мои '@ SessionScoped' beans. – Reitffunk

ответ

1

Во-первых, лучше указать тип события:

@Inject 
private Event<EventObj> events; 

Помимо этого нет никаких указаний в спецификации, которая будет ограничивать экземпляры компонента, на которые вызывается метод наблюдателя. Я бы опубликовал вопрос об этом (в bugtracker реализации, которую вы используете. Возможно, Weld?)

+0

Я не могу получить javax.enterprise.context.SessionScoped bean для наблюдения за событиями, вызванными javax.enterprise.context.ApplicationScoped bean. Исключено: WELD-001303 Нет активных контекстов для области видимости javax.enterprise.context.ConversationScoped. – Steven

0

Я обнаружил, что все зарегистрированные наблюдатели уволены.

Прежде всего, если у меня есть наблюдатель на компоненте Scope Scobe и этот компонент не активен в текущем Разговоре, тогда, когда событие запущено, новый экземпляр создается специально для его получения!