суббота, 5 марта 2011 г.

CDI Events

Для чего нам может быть нужен Observer?
Первое, что приходит в голову: логирование операций пользователя. Сохраняет/изменяет человек какие-то данные на портале - одновременно с сохранением требуемой информации нужно ещё и сделать запись в лог, что такой-то пользователь в такое-то время изменил такую-то информацию.

Как реализуется?
Для начала необходимо определить тип (название) события, которое мы хотим ловить. Для этого создаём аннотацию:


@Qualifier

@Target({FIELD, PARAMETER, METHOD, TYPE})

@Retention(RetentionPolicy.RUNTIME)

public @interface DataChangeEvent {   

}

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

public class DataChangeInfo implements Serializable {

    public User user;

    public Data data;

    public DataChangeInfo(User user, Data data) {

        this.user = user;

        this.data = data;

    }

}

В сервисе, ответственном за сохранение, с помощью Dependency Injection определяем объект-событие:

@Inject 
@DataChangeEvent

private Event<DataChangeInfo> eventHandler;


И теперь в методу сохранения можно создать данной событие:
public void saveData(Data data, User user) {

    entityManager.merge(data);

    eventHandler.fire(new DataChangeInfo(user,data));

}

Осталось лишь реализовать подписчиков на это событие:

@Stateless

public class DataChangeSubscriber {

   

    public void dataWasChanged(@Observes @DataChangeEvent DataChangeInfo info) {

        Date date = new Date();

        User user = info.user;

        Data data = info.data;

        //Сохраняем data, user, date в лог.

    }

}

Вот и всё, что нужно для функционирования механизма.

Комментариев нет:

Отправить комментарий