private void runOneSession() throws InterruptedException { subscriberCount++; Integer subscriptionPosition = positionSource.getSubscriptionPosition(); BlockingQueue<Update<T>> currentUpdates = new ArrayBlockingQueue<>(config.getBatchSize()); SessionSubscriber<T> subscriber = new SessionSubscriber<>(currentUpdates, "" + subscriberCount); LambdaSubscriber<EventSubscriptionUpdate<T>> boundedSubscriber = Subscribers.bounded( config.getBatchSize(), subscriber::onNext, subscriber::onError, subscriber::onComplete); try { logger.info("Subscribing to event store ..."); repository.getPublisher(subscriptionPosition).subscribe(boundedSubscriber); while (processUpdates(currentUpdates)) { logger.debug("Processed updates, will do more"); retryCount.set(0); } // Clean exit, can only mean we're at the end of the subscription, or been explicitly // cancelled logger.info("Subscription worker finishing cleanly"); } finally { logger.info("Subscription worker exiting"); subscriber.kill(); boundedSubscriber.dispose(); } }
private void runOneSession() throws InterruptedException { subscriberCount++; Integer subscriptionPosition = positionSource.getSubscriptionPosition(); BlockingQueue<Update<T>> currentUpdates = new ArrayBlockingQueue<>(config.getBatchSize()); SessionSubscriber<T> subscriber = new SessionSubscriber<>(currentUpdates, "" + subscriberCount); LambdaSubscriber<EventSubscriptionUpdate<T>> boundedSubscriber = Subscribers.bounded( config.getBatchSize(), subscriber::onNext, subscriber::onError, subscriber::onComplete); try { logger.info("Subscribing to event store ..."); repository.getPublisher(subscriptionPosition).subscribe(boundedSubscriber); while (processUpdates(currentUpdates)) { logger.debug("Processed updates, will do more"); retryCount.set(0); } // Clean exit, can only mean we're at the end of the subscription, or been explicitly // cancelled logger.info("Subscription worker finishing cleanly"); } finally { logger.info("Subscription worker exiting"); subscriber.kill(); boundedSubscriber.dispose(); } }
@Test @Ignore // Manual only public void testRetriesOnHandlerErrorWithBackoff() { EventRepository<String> repository = mock(EventRepository.class); EventSubscriptionPositionSource positionSource = mock(EventSubscriptionPositionSource.class); when(repository.getPublisher(any())).then(position -> { WorkQueueProcessor<EventRecord<String>> processor = WorkQueueProcessor.create(); Flux<EventRecord<String>> eventSource = Flux .fromStream(IntStream.range(0, 1000000).mapToObj(this::wrapIntAsEvent)) .doOnNext(e -> { lastProducedValue = e.getEvent(); }); eventSource.subscribe(processor); return processor; }); when(positionSource.getSubscriptionPosition()).thenReturn(null); ErroringSubscriptionHandler<String> subscriptionHandler = new ErroringSubscriptionHandler<>(0); EventSubscriptionManager subscriptionManager = new EventSubscriptionManager<>( repository, positionSource, subscriptionHandler, new SubscriptionWorkerConfig().withBatchSize(64)); SubscriptionToken token = subscriptionManager.start(); sleep(100000); token.stop(); }
}); when(positionSource.getSubscriptionPosition()).thenReturn(null); ErroringSubscriptionHandler<String> subscriptionHandler = new ErroringSubscriptionHandler<>(300);
when(positionSource.getSubscriptionPosition()).thenReturn(null); SlowSubscriptionHandler<String> subscriptionHandler = new SlowSubscriptionHandler<>();
@Test @Ignore // Manual only public void testRetriesOnStreamError() { EventRepository<String> repository = mock(EventRepository.class); EventSubscriptionPositionSource positionSource = mock(EventSubscriptionPositionSource.class); when(repository.getPublisher(any())).then(position -> { WorkQueueProcessor<EventRecord<String>> processor = WorkQueueProcessor.create(); Flux<EventRecord<String>> eventSource = Flux .fromStream(IntStream.range(0, 1000000).mapToObj(this::wrapIntAsEvent)) .doOnNext(e -> { lastProducedValue = e.getEvent(); }); eventSource.subscribe(processor); return processor.take(100).thenMany(Flux.error(new RuntimeException("fail!"))); }); when(positionSource.getSubscriptionPosition()).thenReturn(null); SlowSubscriptionHandler<String> subscriptionHandler = new SlowSubscriptionHandler<>(); EventSubscriptionManager subscriptionManager = new EventSubscriptionManager<>( repository, positionSource, subscriptionHandler, new SubscriptionWorkerConfig().withBatchSize(64)); SubscriptionToken token = subscriptionManager.start(); sleep(100000); token.stop(); }