@Test public void createDefault() { WorkQueueProcessor<Integer> processor = WorkQueueProcessor.create(); assertProcessor(processor, false, null, null, null, null, null, null); }
@Test public void createOverrideNameBufferSize() { String name = "nameOverride"; int bufferSize = 1024; WorkQueueProcessor<Integer> processor = WorkQueueProcessor.create(name, bufferSize); assertProcessor(processor, false, name, bufferSize, null, null, null, null); }
@Test public void scanProcessor() { WorkQueueProcessor<String> test = WorkQueueProcessor.create("name", 16); Subscription subscription = Operators.emptySubscription(); test.onSubscribe(subscription); Assertions.assertThat(test.scan(Scannable.Attr.PARENT)).isEqualTo(subscription); Assertions.assertThat(test.scan(Scannable.Attr.CAPACITY)).isEqualTo(16); Assertions.assertThat(test.scan(Scannable.Attr.TERMINATED)).isFalse(); Assertions.assertThat(test.scan(Scannable.Attr.ERROR)).isNull(); test.onError(new IllegalStateException("boom")); Assertions.assertThat(test.scan(Scannable.Attr.ERROR)).hasMessage("boom"); Assertions.assertThat(test.scan(Scannable.Attr.TERMINATED)).isTrue(); }
@Test public void scanInner() { WorkQueueProcessor<String> main = WorkQueueProcessor.create("name", 16); CoreSubscriber<String> subscriber = new LambdaSubscriber<>(null, e -> {}, null, null); WorkQueueProcessor.WorkQueueInner<String> test = new WorkQueueProcessor.WorkQueueInner<>( subscriber, main); Assertions.assertThat(test.scan(Scannable.Attr.PARENT)).isSameAs(main); Assertions.assertThat(test.scan(Scannable.Attr.ACTUAL)).isSameAs(subscriber); Assertions.assertThat(test.scan(Scannable.Attr.PREFETCH)).isEqualTo(Integer.MAX_VALUE); Assertions.assertThat(test.scan(Scannable.Attr.REQUESTED_FROM_DOWNSTREAM)).isEqualTo(0L); test.pendingRequest.set(123); Assertions.assertThat(test.scan(Scannable.Attr.REQUESTED_FROM_DOWNSTREAM)).isEqualTo(123L); Assertions.assertThat(test.scan(Scannable.Attr.TERMINATED)).isFalse(); Assertions.assertThat(test.scan(Scannable.Attr.CANCELLED)).isFalse(); main.terminated = 1; Assertions.assertThat(test.scan(Scannable.Attr.TERMINATED)).isTrue(); Assertions.assertThat(test.scan(Scannable.Attr.CANCELLED)).isFalse(); test.cancel(); Assertions.assertThat(test.scan(Scannable.Attr.CANCELLED)).isTrue(); }
@Test(timeout = 15000L) public void completeDoesNotHang() throws Exception { WorkQueueProcessor<String> wq = WorkQueueProcessor.create(); wq.subscribe(); Assert.assertTrue(wq.downstreamCount() == 1); wq.onComplete(); while (wq.downstreamCount() != 0 && Thread.activeCount() > 2) { } }
@Test(timeout = 15000L) public void cancelDoesNotHang() throws Exception { WorkQueueProcessor<String> wq = WorkQueueProcessor.create(); Disposable d = wq.subscribe(); Assert.assertTrue(wq.downstreamCount() == 1); d.dispose(); while (wq.downstreamCount() != 0 && Thread.activeCount() > 2) { } }
public static ReactorProcProxy safeWorkQueueProcessorProxy() { return new ReactorProcProxy(WorkQueueProcessor.create(), WRAP); }
public static ReactorProcProxy workQueueProcessorProxy() { return new ReactorProcProxy(WorkQueueProcessor.create(), PASS); }
public static ReactorProcProxy workQueueProcessorProxy() { return new ReactorProcProxy(WorkQueueProcessor.create(), PASS); }
public static ReactorProcProxy safeWorkQueueProcessorProxy() { return new ReactorProcProxy(WorkQueueProcessor.create(), WRAP); }
public static ReactorProcProxy serializedWorkQueueProcessorProxy() { return new ReactorProcProxy(WorkQueueProcessor.create().serialize(), PASS); }
public static ReactorProcProxy safeSerializedWorkQueueProcessorProxy() { return new ReactorProcProxy(WorkQueueProcessor.create().serialize(), WRAP); }
public static ReactorProcProxy serializedWorkQueueProcessorProxy() { return new ReactorProcProxy(WorkQueueProcessor.create().serialize(), PASS); }
public static ReactorProcProxy safeSerializedWorkQueueProcessorProxy() { return new ReactorProcProxy(WorkQueueProcessor.create().serialize(), WRAP); }
@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(); }
WorkQueueProcessor.create(); Flux<EventSubscriptionUpdate<String>> eventSource = Flux .fromStream(IntStream
@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(); }
mock(EventSubscriptionPositionSource.class); WorkQueueProcessor<EventSubscriptionUpdate<String>> processor = WorkQueueProcessor.create(); Flux<EventSubscriptionUpdate<String>> eventSource = Flux .fromStream(IntStream