Существует шаблон проектирования "Наблюдатель" (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());
}
}
|