Ретрактивный шаблон и способы замены событий

Я пытаюсь получить рабочий код, который использует Event Sourcing и Retroactive, как описано Мартином Фаулером.

Я немного потерял, как события стоят в очереди? поскольку события отправляются один за другим на процесс EventProcessor и обратную функцию. В своей статье он говорит, что класс EventProcessor будет иметь доступ к очереди событий.

но если мой класс EventProcessor выглядит так

public class DomainEventProcessor {

    public void process(DomainEvent domainEvent) {

        if (domainEvent instanceof ReplacementEvent) {
            processReplacement((ReplacementEvent)domainEvent);
        } else {
            domainEvent.process();
        }
    }

    public void reverse(DomainEvent domainEvent) {
        domainEvent.reverse();
    }

    /*
    // replace the  event in event queue
     */
    private void processReplacement(ReplacementEvent e) {


    }
}

Интерфейс событий домена

public abstract class DomainEvent implements Serializable {

    public abstract void process();

    public abstract void reverse();
}

примерное событие реализации выглядит так:

public class BalanceUpdateEvent extends DomainEvent {

    private String subscriberId;

    private String balanceId;

    private Long delta;

    public String getSubscriberId() {
        return subscriberId;
    }

    public String getBalanceId() {
        return balanceId;
    }

    public Long getDelta() {
        return delta;
    }

    @Override
    public void process() {

    // do nothing
    }

    @Override
    public void reverse() {
        SubscriberDomain subscriberDomain = SubscriberAggregate.getSubscriber(subscriberId);
        subscriberDomain.handleReverseEvent(this);
    }
}

Каждое событие знает, какой доменный объект (который имеет состояние + бизнес-логику) может обрабатывать себя, чтобы внести изменения в состояние объекта домена.

java,events,design-patterns,event-handling,

0

Ответов: 1


0
public class DomainEventProcessor {

    private EventStore es;

    public DomainEventProcessor(EventStore es) {
        this.es = es;
    }

    public void replay(String aggregateId,Date after) {
        List<DomainEvent> events = es.loadEventStreamAfter(aggregateId,after);
        events.sort(Comparator.comparing(DomainEvent::getTimestamp));
        for(DomainEvent event : events) {
            if (event instanceof ReplacementEvent) {
                ReplacementEvent re = (ReplacementEvent)event;
                re.getReplacement().process();
            } else {
                event.process();
            }
        }
    }

    public void reverse(String aggregateId,Date after) {
        List<DomainEvent> events = es.loadEventStreamAfter(aggregateId,after);
        events.sort(Comparator.comparing(DomainEvent::getTimestamp).reversed());
        for(DomainEvent event : events) {
            if (event instanceof ReplacementEvent) {
                ReplacementEvent re = (ReplacementEvent)event;
                re.getOriginal().reverse();
            } else {
                event.reverse();
            }
        }
    }
}
Java, события, дизайн-шаблоны, обработки событий,
Похожие вопросы
Яндекс.Метрика