/** * Returns a new {@link GlobalSequenceTrackingToken} instance that is the sum of this token's sequence number and * the given {@code offset}. * * @param offset the offset between this token's sequence number of that of the returned instance * @return a new tracking token with global sequence increased with the given offset */ public GlobalSequenceTrackingToken offsetBy(int offset) { return new GlobalSequenceTrackingToken(globalIndex + offset); }
@Override public TrackingToken createTailToken() { if (events.size() == 0) { return null; } GlobalSequenceTrackingToken firstToken = (GlobalSequenceTrackingToken) events.firstKey(); return new GlobalSequenceTrackingToken(firstToken.getGlobalIndex() - 1); }
/** * Returns a new {@link GlobalSequenceTrackingToken} instance with sequence number incremented by 1. * * @return a new tracking token with sequence number incremented by 1 */ public GlobalSequenceTrackingToken next() { return offsetBy(1); }
/** * Returns the tracking token to use for the next event to be stored. * * @return the tracking token for the next event */ protected GlobalSequenceTrackingToken nextTrackingToken() { return events.isEmpty() ? new GlobalSequenceTrackingToken(0) : ((GlobalSequenceTrackingToken) events.lastKey()).next(); }
long nextToken = trackingToken == null ? 0 : ((GlobalSequenceTrackingToken) trackingToken).getGlobalIndex() + 1; EventBuffer consumer = new EventBuffer(upcasterChain, getEventSerializer());
/** * Returns the tracking token to use for the next event to be stored. * * @return the tracking token for the next event */ protected GlobalSequenceTrackingToken nextTrackingToken() { return events.isEmpty() ? new GlobalSequenceTrackingToken(0) : ((GlobalSequenceTrackingToken) events.lastKey()).next(); }
long nextToken = trackingToken == null ? 0 : ((GlobalSequenceTrackingToken) trackingToken).getGlobalIndex() + 1; EventBuffer consumer = new EventBuffer(upcasterChain, getEventSerializer());
private Object readResolve() { return new org.axonframework.eventhandling.GlobalSequenceTrackingToken(globalIndex); } }
@Override public TrackingToken createTokenAt(Instant dateTime) { return events.values() .stream() .filter(event -> event.getTimestamp().equals(dateTime) || event.getTimestamp().isAfter(dateTime)) .min(Comparator.comparingLong(e -> ((GlobalSequenceTrackingToken) e.trackingToken()) .getGlobalIndex())) .map(TrackedEventMessage::trackingToken) .map(tt -> (GlobalSequenceTrackingToken) tt) .map(tt -> new GlobalSequenceTrackingToken(tt.getGlobalIndex() - 1)) .orElse(null); }
@Override public void appendEvents(List<? extends EventMessage<?>> events) { synchronized (this.events) { GlobalSequenceTrackingToken trackingToken = nextTrackingToken(); this.events.putAll(IntStream.range(0, events.size()).mapToObj( i -> asTrackedEventMessage((EventMessage<?>) events.get(i), trackingToken.offsetBy(i))).collect( Collectors.toMap(TrackedEventMessage::trackingToken, Function.identity()))); } }
@Override public TrackingToken createHeadToken() { try { io.axoniq.axonserver.grpc.event.TrackingToken token = eventStoreClient.getLastToken().get(); return new GlobalSequenceTrackingToken(token.getToken()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new EventStoreException(e.getMessage(), e); } catch (ExecutionException e) { throw new EventStoreException(e.getMessage(), e); } }
@Override public TrackingToken createTailToken() { if (events.size() == 0) { return null; } GlobalSequenceTrackingToken firstToken = (GlobalSequenceTrackingToken) events.firstKey(); return new GlobalSequenceTrackingToken(firstToken.getGlobalIndex() - 1); }
/** * Returns a new {@link GlobalSequenceTrackingToken} instance with sequence number incremented by 1. * * @return a new tracking token with sequence number incremented by 1 */ public GlobalSequenceTrackingToken next() { return offsetBy(1); }
@Override public TrackingToken createTailToken() { try { io.axoniq.axonserver.grpc.event.TrackingToken token = eventStoreClient.getFirstToken().get(); if (token.getToken() < 0) { return null; } return new GlobalSequenceTrackingToken(token.getToken() - 1); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new EventStoreException(e.getMessage(), e); } catch (ExecutionException e) { throw new EventStoreException(e.getMessage(), e); } }
@Override public TrackingToken createTokenAt(Instant dateTime) { return events.values() .stream() .filter(event -> event.getTimestamp().equals(dateTime) || event.getTimestamp().isAfter(dateTime)) .min(Comparator.comparingLong(e -> ((GlobalSequenceTrackingToken) e.trackingToken()) .getGlobalIndex())) .map(TrackedEventMessage::trackingToken) .map(tt -> (GlobalSequenceTrackingToken) tt) .map(tt -> new GlobalSequenceTrackingToken(tt.getGlobalIndex() - 1)) .orElse(null); }
@Override public void appendEvents(List<? extends EventMessage<?>> events) { synchronized (this.events) { GlobalSequenceTrackingToken trackingToken = nextTrackingToken(); this.events.putAll(IntStream.range(0, events.size()).mapToObj( i -> asTrackedEventMessage((EventMessage<?>) events.get(i), trackingToken.offsetBy(i))).collect( Collectors.toMap(TrackedEventMessage::trackingToken, Function.identity()))); } }
@Override public TrackingToken createTokenAt(Instant instant) { try { io.axoniq.axonserver.grpc.event.TrackingToken token = eventStoreClient.getTokenAt(instant).get(); if (token.getToken() < 0) { return null; } return new GlobalSequenceTrackingToken(token.getToken() - 1); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new EventStoreException(e.getMessage(), e); } catch (ExecutionException e) { throw new EventStoreException(e.getMessage(), e); } }
public boolean push(EventWithToken event) { if( closed) { logger.debug("Received event while closed: {}", event.getToken()); return false; } try { TrackingToken trackingToken = new GlobalSequenceTrackingToken(event.getToken()); events.put(new TrackedDomainEventData<>(trackingToken, new GrpcBackedDomainEventData(event.getEvent()))); } catch (InterruptedException e) { Thread.currentThread().interrupt(); closeCallback.accept(this); return false; } return true; }
@Test public void testBlacklistingSegmentWillHaveProcessorClaimAnotherOne() { tokenStore.storeToken(new GlobalSequenceTrackingToken(1L), "test", 0); tokenStore.storeToken(new GlobalSequenceTrackingToken(2L), "test", 1); tokenStore.storeToken(new GlobalSequenceTrackingToken(2L), "test", 2); testSubject.start(); assertWithin(1, SECONDS, () -> assertEquals(0, testSubject.availableProcessorThreads())); assertEquals(new HashSet<>(asList(0, 1)), testSubject.processingStatus().keySet()); testSubject.releaseSegment(0); assertWithin(5, SECONDS, () -> assertTrue(testSubject.processingStatus().containsKey(2))); assertEquals(new HashSet<>(asList(2, 1)), testSubject.processingStatus().keySet()); assertWithin(2, SECONDS, () -> assertEquals(0, testSubject.availableProcessorThreads())); }
@Test public void testProcessorWorkerCountWithMultipleSegmentsWithOneThread() throws InterruptedException { tokenStore.storeToken(new GlobalSequenceTrackingToken(1L), "test", 0); tokenStore.storeToken(new GlobalSequenceTrackingToken(2L), "test", 1); configureProcessor(TrackingEventProcessorConfiguration.forSingleThreadedProcessing()); testSubject.start(); // give it some time to split segments from the store and submit to executor service. Thread.sleep(200); assertThat(testSubject.activeProcessorThreads(), is(1)); }