Для чего нам может быть нужен 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 в лог.
}
}
Вот и всё, что нужно для функционирования механизма.