/** * Indicates whether the given {@code trackingToken} represents a position that is part of a replay. * * @param trackingToken The token to verify * @return {@code true} if the token indicates a replay */ public static boolean isReplay(TrackingToken trackingToken) { return trackingToken instanceof ReplayToken && ((ReplayToken) trackingToken).isReplay(); }
/** * Indicates whether the given message is "redelivered", as a result of a previous reset. If {@code true}, this * means this message has been delivered to this processor before its token was reset. * * @param message The message to inspect * @return {@code true} if the message is a replay */ public static boolean isReplay(Message<?> message) { return message instanceof TrackedEventMessage && isReplay(((TrackedEventMessage) message).trackingToken()); }
@Override public Object handle(Message<?> message, T target) throws Exception { if (ReplayToken.isReplay(message)) { return null; } return super.handle(message, target); } }
@Test public void testResetBeforeStartingPerformsANormalRun() throws Exception { when(mockHandler.supportsReset()).thenReturn(true); final List<String> handled = new CopyOnWriteArrayList<>(); final List<String> handledInRedelivery = new CopyOnWriteArrayList<>(); //noinspection Duplicates doAnswer(i -> { EventMessage message = i.getArgument(0); handled.add(message.getIdentifier()); if (ReplayToken.isReplay(message)) { handledInRedelivery.add(message.getIdentifier()); } return null; }).when(mockHandler).handle(any()); testSubject.start(); testSubject.shutDown(); testSubject.resetTokens(); testSubject.start(); eventBus.publish(createEvents(4)); assertWithin(1, TimeUnit.SECONDS, () -> assertEquals(4, handled.size())); assertEquals(0, handledInRedelivery.size()); assertFalse(testSubject.processingStatus().get(0).isReplaying()); }
@Test public void testResetCausesEventsToBeReplayed() throws Exception { when(mockHandler.supportsReset()).thenReturn(true); final List<String> handled = new CopyOnWriteArrayList<>(); final List<String> handledInRedelivery = new CopyOnWriteArrayList<>(); //noinspection Duplicates doAnswer(i -> { EventMessage message = i.getArgument(0); handled.add(message.getIdentifier()); if (ReplayToken.isReplay(message)) { handledInRedelivery.add(message.getIdentifier()); } return null; }).when(mockHandler).handle(any()); eventBus.publish(createEvents(4)); testSubject.start(); assertWithin(1, TimeUnit.SECONDS, () -> assertEquals(4, handled.size())); testSubject.shutDown(); testSubject.resetTokens(); // Resetting twice caused problems (see issue #559) testSubject.resetTokens(); testSubject.start(); assertWithin(1, TimeUnit.SECONDS, () -> assertEquals(8, handled.size())); assertEquals(handled.subList(0, 4), handled.subList(4, 8)); assertEquals(handled.subList(4, 8), handledInRedelivery); assertTrue(testSubject.processingStatus().get(0).isReplaying()); eventBus.publish(createEvents(1)); assertWithin(1, TimeUnit.SECONDS, () -> assertFalse(testSubject.processingStatus().get(0).isReplaying())); }
@Test public void testResetToPositionCausesCertainEventsToBeReplayed() throws Exception { when(mockHandler.supportsReset()).thenReturn(true); final List<String> handled = new CopyOnWriteArrayList<>(); final List<String> handledInRedelivery = new CopyOnWriteArrayList<>(); //noinspection Duplicates doAnswer(i -> { EventMessage message = i.getArgument(0); handled.add(message.getIdentifier()); if (ReplayToken.isReplay(message)) { handledInRedelivery.add(message.getIdentifier()); } return null; }).when(mockHandler).handle(any()); eventBus.publish(createEvents(4)); testSubject.start(); assertWithin(1, TimeUnit.SECONDS, () -> assertEquals(4, handled.size())); testSubject.shutDown(); testSubject.resetTokens(source -> new GlobalSequenceTrackingToken(1L)); testSubject.start(); assertWithin(1, TimeUnit.SECONDS, () -> assertEquals(6, handled.size())); assertFalse(handledInRedelivery.contains(handled.get(0))); assertFalse(handledInRedelivery.contains(handled.get(1))); assertEquals(handled.subList(2, 4), handled.subList(4, 6)); assertEquals(handled.subList(4, 6), handledInRedelivery); assertTrue(testSubject.processingStatus().get(0).isReplaying()); eventBus.publish(createEvents(1)); assertWithin(1, TimeUnit.SECONDS, () -> assertFalse(testSubject.processingStatus().get(0).isReplaying())); }
EventMessage message = i.getArgument(0); handled.add(message.getIdentifier()); if (ReplayToken.isReplay(message)) { handledInRedelivery.add(message.getIdentifier());
/** * Indicates whether the given {@code trackingToken} represents a position that is part of a replay. * * @param trackingToken The token to verify * @return {@code true} if the token indicates a replay */ public static boolean isReplay(TrackingToken trackingToken) { return trackingToken instanceof ReplayToken && ((ReplayToken) trackingToken).isReplay(); }
/** * Indicates whether the given {@code trackingToken} represents a position that is part of a replay. * * @param trackingToken The token to verify * @return {@code true} if the token indicates a replay */ public static boolean isReplay(TrackingToken trackingToken) { return trackingToken instanceof ReplayToken && ((ReplayToken) trackingToken).isReplay(); }
@Override public Object handle(Message<?> message, T target) throws Exception { if (ReplayToken.isReplay(message)) { return null; } return super.handle(message, target); } }
@Override public Object handle(Message<?> message, T target) throws Exception { if (ReplayToken.isReplay(message)) { return null; } return super.handle(message, target); } }
/** * Indicates whether the given message is "redelivered", as a result of a previous reset. If {@code true}, this * means this message has been delivered to this processor before its token was reset. * * @param message The message to inspect * @return {@code true} if the message is a replay */ public static boolean isReplay(Message<?> message) { return message instanceof TrackedEventMessage && isReplay(((TrackedEventMessage) message).trackingToken()); }
/** * Indicates whether the given message is "redelivered", as a result of a previous reset. If {@code true}, this * means this message has been delivered to this processor before its token was reset. * * @param message The message to inspect * @return {@code true} if the message is a replay */ public static boolean isReplay(Message<?> message) { return message instanceof TrackedEventMessage && isReplay(((TrackedEventMessage) message).trackingToken()); }