/** * {@inheritDoc} * <p> * This implementation returns a {@link DomainEventStream} starting with the last stored snapshot of the aggregate * followed by subsequent domain events. */ @Override public DomainEventStream readEvents(String aggregateIdentifier) { Optional<DomainEventMessage<?>> optionalSnapshot; try { optionalSnapshot = storageEngine.readSnapshot(aggregateIdentifier); } catch (Exception | LinkageError e) { optionalSnapshot = handleSnapshotReadingError(aggregateIdentifier, e); } DomainEventStream eventStream; if (optionalSnapshot.isPresent()) { DomainEventMessage<?> snapshot = optionalSnapshot.get(); eventStream = DomainEventStream.concat(DomainEventStream.of(snapshot), storageEngine.readEvents(aggregateIdentifier, snapshot.getSequenceNumber() + 1)); } else { eventStream = storageEngine.readEvents(aggregateIdentifier); } Stream<? extends DomainEventMessage<?>> domainEventMessages = stagedDomainEventMessages(aggregateIdentifier); return DomainEventStream.concat(eventStream, DomainEventStream.of(domainEventMessages)); }
/** * Returns a Stream of all DomainEventMessages that have been staged for publication by an Aggregate with given * {@code aggregateIdentifier}. * * @param aggregateIdentifier The identifier of the aggregate to get staged events for * @return a Stream of DomainEventMessage of the identified aggregate */ protected Stream<? extends DomainEventMessage<?>> stagedDomainEventMessages(String aggregateIdentifier) { return queuedMessages().stream() .filter(m -> m instanceof DomainEventMessage) .map(m -> (DomainEventMessage<?>) m) .filter(m -> aggregateIdentifier.equals(m.getAggregateIdentifier())); }
@Override protected AxonIQEventStorageEngine storageEngine() { return (AxonIQEventStorageEngine) super.storageEngine(); }
@Override public Optional<Long> lastSequenceNumberFor(String aggregateIdentifier) { Optional<Long> highestStaged = stagedDomainEventMessages(aggregateIdentifier) .map(DomainEventMessage::getSequenceNumber) .max(Long::compareTo); if (highestStaged.isPresent()) { return highestStaged; } return storageEngine.lastSequenceNumberFor(aggregateIdentifier); }
@Override public DomainEventStream readEvents(String aggregateIdentifier, long firstSequenceNumber) { return DomainEventStream.concat(storageEngine.readEvents(aggregateIdentifier, firstSequenceNumber), DomainEventStream.of( stagedDomainEventMessages(aggregateIdentifier) .filter(m -> m.getSequenceNumber() >= firstSequenceNumber))); }
/** * {@inheritDoc} * <p> * This implementation returns a {@link DomainEventStream} starting with the last stored snapshot of the aggregate * followed by subsequent domain events. */ @Override public DomainEventStream readEvents(String aggregateIdentifier) { Optional<DomainEventMessage<?>> optionalSnapshot; try { optionalSnapshot = storageEngine.readSnapshot(aggregateIdentifier); } catch (Exception | LinkageError e) { optionalSnapshot = handleSnapshotReadingError(aggregateIdentifier, e); } DomainEventStream eventStream; if (optionalSnapshot.isPresent()) { DomainEventMessage<?> snapshot = optionalSnapshot.get(); eventStream = DomainEventStream.concat(DomainEventStream.of(snapshot), storageEngine.readEvents(aggregateIdentifier, snapshot.getSequenceNumber() + 1)); } else { eventStream = storageEngine.readEvents(aggregateIdentifier); } Stream<? extends DomainEventMessage<?>> domainEventMessages = stagedDomainEventMessages(aggregateIdentifier); return DomainEventStream.concat(eventStream, DomainEventStream.of(domainEventMessages)); }
@Override public Optional<Long> lastSequenceNumberFor(String aggregateIdentifier) { Optional<Long> highestStaged = stagedDomainEventMessages(aggregateIdentifier) .map(DomainEventMessage::getSequenceNumber) .max(Long::compareTo); if (highestStaged.isPresent()) { return highestStaged; } return storageEngine.lastSequenceNumberFor(aggregateIdentifier); }
/** * Returns a Stream of all DomainEventMessages that have been staged for publication by an Aggregate with given * {@code aggregateIdentifier}. * * @param aggregateIdentifier The identifier of the aggregate to get staged events for * @return a Stream of DomainEventMessage of the identified aggregate */ protected Stream<? extends DomainEventMessage<?>> stagedDomainEventMessages(String aggregateIdentifier) { return queuedMessages().stream() .filter(m -> m instanceof DomainEventMessage) .map(m -> (DomainEventMessage<?>) m) .filter(m -> aggregateIdentifier.equals(m.getAggregateIdentifier())); }
@Override protected AxonIQEventStorageEngine storageEngine() { return (AxonIQEventStorageEngine) super.storageEngine(); }
/** * {@inheritDoc} * <p> * This implementation returns a {@link DomainEventStream} starting with the last stored snapshot of the aggregate * followed by subsequent domain events. */ @Override public DomainEventStream readEvents(String aggregateIdentifier) { Optional<DomainEventMessage<?>> optionalSnapshot; try { optionalSnapshot = storageEngine.readSnapshot(aggregateIdentifier); } catch (Exception | LinkageError e) { optionalSnapshot = handleSnapshotReadingError(aggregateIdentifier, e); } DomainEventStream eventStream; if (optionalSnapshot.isPresent()) { DomainEventMessage<?> snapshot = optionalSnapshot.get(); eventStream = DomainEventStream.concat(DomainEventStream.of(snapshot), storageEngine.readEvents(aggregateIdentifier, snapshot.getSequenceNumber() + 1)); } else { eventStream = storageEngine.readEvents(aggregateIdentifier); } Stream<? extends DomainEventMessage<?>> domainEventMessages = stagedDomainEventMessages(aggregateIdentifier); return DomainEventStream.concat(eventStream, DomainEventStream.of(domainEventMessages)); }
@Override public Optional<Long> lastSequenceNumberFor(String aggregateIdentifier) { Optional<Long> highestStaged = stagedDomainEventMessages(aggregateIdentifier) .map(DomainEventMessage::getSequenceNumber) .max(Long::compareTo); if (highestStaged.isPresent()) { return highestStaged; } return storageEngine.lastSequenceNumberFor(aggregateIdentifier); }
/** * Returns a Stream of all DomainEventMessages that have been staged for publication by an Aggregate with given * {@code aggregateIdentifier}. * * @param aggregateIdentifier The identifier of the aggregate to get staged events for * @return a Stream of DomainEventMessage of the identified aggregate */ protected Stream<? extends DomainEventMessage<?>> stagedDomainEventMessages(String aggregateIdentifier) { return queuedMessages().stream() .filter(m -> m instanceof DomainEventMessage) .map(m -> (DomainEventMessage<?>) m) .filter(m -> aggregateIdentifier.equals(m.getAggregateIdentifier())); }
@Override public DomainEventStream readEvents(String aggregateIdentifier, long firstSequenceNumber) { return DomainEventStream.concat(storageEngine.readEvents(aggregateIdentifier, firstSequenceNumber), DomainEventStream.of( stagedDomainEventMessages(aggregateIdentifier) .filter(m -> m.getSequenceNumber() >= firstSequenceNumber))); }
@Override public DomainEventStream readEvents(String aggregateIdentifier, long firstSequenceNumber) { return DomainEventStream.concat(storageEngine.readEvents(aggregateIdentifier, firstSequenceNumber), DomainEventStream.of( stagedDomainEventMessages(aggregateIdentifier) .filter(m -> m.getSequenceNumber() >= firstSequenceNumber))); }