@Override @SuppressWarnings("unchecked") protected List<? extends DomainEventData<?>> fetchDomainEvents(String aggregateIdentifier, long firstSequenceNumber, int batchSize) { return transactionManager.fetchInTransaction( () -> entityManager() .createQuery( "SELECT new org.axonframework.eventhandling.GenericDomainEventEntry(" + "e.type, e.aggregateIdentifier, e.sequenceNumber, e.eventIdentifier, e.timeStamp, " + "e.payloadType, e.payloadRevision, e.payload, e.metaData) FROM " + domainEventEntryEntityName() + " e WHERE e.aggregateIdentifier = :id " + "AND e.sequenceNumber >= :seq ORDER BY e.sequenceNumber ASC" ) .setParameter("id", aggregateIdentifier) .setParameter("seq", firstSequenceNumber) .setMaxResults(batchSize) .getResultList()); }
@Override @SuppressWarnings("unchecked") protected Stream<? extends DomainEventData<?>> readSnapshotData(String aggregateIdentifier) { return transactionManager.fetchInTransaction( () -> entityManager() .createQuery( "SELECT new org.axonframework.eventhandling.GenericDomainEventEntry(" + "e.type, e.aggregateIdentifier, e.sequenceNumber, e.eventIdentifier, " + "e.timeStamp, e.payloadType, e.payloadRevision, e.payload, e.metaData) FROM " + snapshotEventEntryEntityName() + " e " + "WHERE e.aggregateIdentifier = :id " + "ORDER BY e.sequenceNumber DESC" ) .setParameter("id", aggregateIdentifier) .setMaxResults(1) .getResultList() .stream() ); }
private BlockingStream<TrackedEventMessage<?>> ensureEventStreamOpened( BlockingStream<TrackedEventMessage<?>> eventStreamIn, Segment segment) { BlockingStream<TrackedEventMessage<?>> eventStream = eventStreamIn; if (eventStream == null && state.get().isRunning()) { final TrackingToken trackingToken = transactionManager.fetchInTransaction( () -> tokenStore.fetchToken(getName(), segment.getSegmentId()) ); logger.info("Fetched token: {} for segment: {}", trackingToken, segment); eventStream = transactionManager.fetchInTransaction( () -> doOpenStream(trackingToken)); } return eventStream; }
@Override public TrackingToken createTailToken() { String sql = "SELECT min(" + schema.globalIndexColumn() + ") - 1 FROM " + schema.domainEventTable(); Long index = transactionManager.fetchInTransaction( () -> executeQuery(getConnection(), connection -> connection.prepareStatement(sql), resultSet -> nextAndExtract(resultSet, 1, Long.class), e -> new EventStoreException("Failed to get tail token", e))); return Optional.ofNullable(index) .map(seq -> GapAwareTrackingToken.newInstance(seq, Collections.emptySet())) .orElse(null); }
@Override public TrackingToken createHeadToken() { String sql = "SELECT max(" + schema.globalIndexColumn() + ") FROM " + schema.domainEventTable(); Long index = transactionManager.fetchInTransaction( () -> executeQuery(getConnection(), connection -> connection.prepareStatement(sql), resultSet -> nextAndExtract(resultSet, 1, Long.class), e -> new EventStoreException("Failed to get head token", e))); return Optional.ofNullable(index) .map(seq -> GapAwareTrackingToken.newInstance(seq, Collections.emptySet())) .orElse(null); }
@Override protected Stream<? extends DomainEventData<?>> readSnapshotData(String aggregateIdentifier) { return transactionManager.fetchInTransaction(() -> { List<DomainEventData<?>> result = executeQuery(getConnection(), connection -> readSnapshotData(connection, aggregateIdentifier), JdbcUtils.listResults(this::getSnapshotData), e -> new EventStoreException( format("Error reading aggregate snapshot [%s]", aggregateIdentifier), e)); return result.stream(); }); }
@Override public Optional<Long> lastSequenceNumberFor(String aggregateIdentifier) { String sql = "SELECT max(" + schema.sequenceNumberColumn() + ") FROM " + schema.domainEventTable() + " WHERE " + schema.aggregateIdentifierColumn() + " = ?"; return Optional.ofNullable(transactionManager.fetchInTransaction( () -> executeQuery(getConnection(), connection -> { PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, aggregateIdentifier); return stmt; }, resultSet -> nextAndExtract(resultSet, 1, Long.class), e -> new EventStoreException( format("Failed to read events for aggregate [%s]", aggregateIdentifier), e ) ))); }
@Override protected List<? extends DomainEventData<?>> fetchDomainEvents(String aggregateIdentifier, long firstSequenceNumber, int batchSize) { return transactionManager.fetchInTransaction( () -> executeQuery( getConnection(), connection -> readEventData(connection, aggregateIdentifier, firstSequenceNumber, batchSize), JdbcUtils.listResults(this::getDomainEventData), e -> new EventStoreException( format("Failed to read events for aggregate [%s]", aggregateIdentifier), e ) )); }
private GapAwareTrackingToken cleanedToken(GapAwareTrackingToken lastToken) { GapAwareTrackingToken previousToken = lastToken; if (lastToken != null && lastToken.getGaps().size() > gapCleaningThreshold) { List<Object[]> results = transactionManager.fetchInTransaction(() -> entityManager() .createQuery( "SELECT e.globalIndex, e.timeStamp FROM " + domainEventEntryEntityName() + " e "
@Override public TrackingToken createTokenAt(Instant dateTime) { String sql = "SELECT min(" + schema.globalIndexColumn() + ") - 1 FROM " + schema.domainEventTable() + " WHERE " + schema.timestampColumn() + " >= ?"; Long index = transactionManager.fetchInTransaction( () -> executeQuery(getConnection(), connection -> { PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, formatInstant(dateTime)); return stmt; }, resultSet -> nextAndExtract(resultSet, 1, Long.class), e -> new EventStoreException(format("Failed to get token at [%s]", dateTime), e))); if (index == null) { return null; } return GapAwareTrackingToken.newInstance(index, Collections.emptySet()); }
List<Object[]> entries = transactionManager.fetchInTransaction(() -> {
tokenStoreCurrentSegments = transactionManager.fetchInTransaction( () -> { TrackingToken initialToken = initialTrackingTokenBuilder.apply(messageSource);
isTrue(lastToken == null || lastToken instanceof GapAwareTrackingToken, () -> "Unsupported token format: " + lastToken); List<TrackedEventData<?>> trackedEventData = transactionManager.fetchInTransaction(() -> {
mockTransactionManager = mock(TransactionManager.class); when(mockTransactionManager.startTransaction()).thenReturn(mockTransaction); when(mockTransactionManager.fetchInTransaction(any(Supplier.class))).thenAnswer(i -> { Supplier s = i.getArgument(0); return s.get();
private MessageStream<TrackedEventMessage<?>> ensureEventStreamOpened( MessageStream<TrackedEventMessage<?>> eventStreamIn, Segment segment) { MessageStream<TrackedEventMessage<?>> eventStream = eventStreamIn; if (eventStream == null && state.get().isRunning()) { final TrackingToken trackingToken = transactionManager.fetchInTransaction(() -> tokenStore.fetchToken(getName(), segment.getSegmentId())); logger.info("Fetched token: {} for segment: {}", trackingToken, segment); eventStream = transactionManager.fetchInTransaction( () -> doOpenStream(trackingToken)); } return eventStream; }
@Override protected Optional<? extends DomainEventData<?>> readSnapshotData(String aggregateIdentifier) { return transactionManager.fetchInTransaction(() -> { List<DomainEventData<?>> result = executeQuery(getConnection(), connection -> readSnapshotData(connection, aggregateIdentifier), JdbcUtils.listResults(this::getSnapshotData), e -> new EventStoreException( format("Error reading aggregate snapshot [%s]", aggregateIdentifier), e)); return result.stream().findFirst(); }); }
@Override public TrackingToken createHeadToken() { String sql = "SELECT max(" + schema.globalIndexColumn() + ") FROM " + schema.domainEventTable(); Long index = transactionManager.fetchInTransaction( () -> executeQuery(getConnection(), connection -> connection.prepareStatement(sql), resultSet -> nextAndExtract(resultSet, 1, Long.class), e -> new EventStoreException("Failed to get head token", e))); return Optional.ofNullable(index) .map(seq -> GapAwareTrackingToken.newInstance(seq, Collections.emptySet())) .orElse(null); }
@Override public TrackingToken createTailToken() { String sql = "SELECT min(" + schema.globalIndexColumn() + ") - 1 FROM " + schema.domainEventTable(); Long index = transactionManager.fetchInTransaction( () -> executeQuery(getConnection(), connection -> connection.prepareStatement(sql), resultSet -> nextAndExtract(resultSet, 1, Long.class), e -> new EventStoreException("Failed to get tail token", e))); return Optional.ofNullable(index) .map(seq -> GapAwareTrackingToken.newInstance(seq, Collections.emptySet())) .orElse(null); }
@Override protected Stream<? extends DomainEventData<?>> readSnapshotData(String aggregateIdentifier) { return transactionManager.fetchInTransaction(() -> { List<DomainEventData<?>> result = executeQuery(getConnection(), connection -> readSnapshotData(connection, aggregateIdentifier), JdbcUtils.listResults(this::getSnapshotData), e -> new EventStoreException( format("Error reading aggregate snapshot [%s]", aggregateIdentifier), e)); return result.stream(); }); }
@Override protected List<? extends DomainEventData<?>> fetchDomainEvents(String aggregateIdentifier, long firstSequenceNumber, int batchSize) { return transactionManager.fetchInTransaction( () -> executeQuery( getConnection(), connection -> readEventData(connection, aggregateIdentifier, firstSequenceNumber, batchSize), JdbcUtils.listResults(this::getDomainEventData), e -> new EventStoreException( format("Failed to read events for aggregate [%s]", aggregateIdentifier), e ) )); }