Приветствую Вас ГостьВторник, 14.05.2024, 17:01

Программирование на Java, Android, Delphi


Блог

Главная » 2014 » Октябрь » 16 » События в CDI
11:39
События в CDI

Существует шаблон проектирования "Наблюдатель" (Observer) или «подчинённые» (Dependents) или «издатель-подписчик» (Publisher-Subscriber). Суть в том что есть класс, который генерируют события и есть другие классы, которые подписываются на них. Когда главный класс зажигает событие, его обрабатывают все кто подписался на данный тип событий. CDI поддерживает данный шаблон проектирования через механизм событий. Как всегда используются несколько аннотаций.

Вот класс объявляет объект событие и генерирует событие

 @Inject Event addBuyerEvent;

 public String addUser(){
 Buyer b = new Buyer(idGen.generate(), firstName, secondName, thirdName, phonePrefix + phone_number.pnone(), defEmail);
 buyerFacade.create(b);
 //em.persist(b);
 log.log(Level.INFO, "зажигаем событие - пользователь добавлен");
 addBuyerEvent.fire(b);
 return "added";
 }

Вот другой класс обрабатывает событие. Весь механизм подписки обеспечивается контейнером CDI

package common;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import jpa.Buyer;

public class AddBuyerObserver {
 @Inject Logger log;
 
 public void AddBuyerHandler(@Observes Buyer buyer){
 log.log(Level.WARNING, "Отработало событие - добавлен пользователь " + buyer.getFirstname() + " " + buyer.getSecondname() + " " + buyer.getThirdname());
 }
 
}

Если нам нужно создать несколько событий принимающих объект одного типа и отличать эти события при обработке - используются квалификаторы:

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface QAddBuyer {
}

@Qualifier
@Retention(RUNTIME)
@Target({METHOD, FIELD, PARAMETER, TYPE})
public @interface QChangeOrder {
}
Соответсвенно объявление событий и зажигание будет выглядеть так:
 @Inject @QAddBuyer Event addBuyerEvent;
 @Inject @QChangeOrder Event changeOrderEvent;

 public String addUser(){
 Buyer b = new Buyer(idGen.generate(), firstName, secondName, thirdName, phonePrefix + phone_number.pnone(), defEmail);
 buyerFacade.create(b);
 //em.persist(b);
 log.log(Level.INFO, "зажигаем событие - пользователь добавлен");
 addBuyerEvent.fire(b);
 log.log(Level.INFO, "зажигаем событие - изменяем заказ");
 changeOrderEvent.fire(b);
 return "added";
 }
Обработка событий будет такая:
public class AddBuyerObserver {
 @Inject Logger log;
 
 public void AddBuyerHandler(@Observes @QAddBuyer Buyer buyer){
 log.log(Level.WARNING, "Отработало событие - добавлен пользователь " + buyer.getFirstname() + " " + buyer.getSecondname() + " " + buyer.getThirdname());
 }
 
 public void ChangeOrderHandler(@Observes @QChangeOrder Buyer buyer){
 log.log(Level.WARNING, "Отработало событие - изменен заказ " + buyer.getFirstname() + " " + buyer.getSecondname() + " " + buyer.getThirdname());
 }
 
}

Категория: Java EE | Просмотров: 691 | Добавил: alex | Теги: события, CDI | Рейтинг: 5.0/1
Категории раздела
Java (Общие вопросы) [17]
Java (Библиотека, пакеты Java) [17]
Java (Разработка программного обеспечения на Java) [5]
Java (Среда разработки NetBeans) [5]
JSF + PrimeFaces [21]
Java EE [11]
Разное [3]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Поиск
Календарь
«  Октябрь 2014  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031
Архив записей