@Test public void chainedTopicProcessor() throws Exception{ ExecutorService es = Executors.newFixedThreadPool(2); try { TopicProcessor<String> bc = TopicProcessor.<String>builder().executor(es).bufferSize(16).build(); int elems = 100; CountDownLatch latch = new CountDownLatch(elems); bc.subscribe(sub("spec1", latch)); Flux.range(0, elems) .map(s -> "hello " + s) .subscribe(bc); assertTrue(latch.await(5000, TimeUnit.MILLISECONDS)); } finally { es.shutdown(); } }
@Test public void testCustomRequestTaskThreadName() { String expectedName = "topicProcessorRequestTaskCreate"; //NOTE: the below single executor should not be used usually as requestTask assumes it immediately gets executed ExecutorService customTaskExecutor = Executors.newSingleThreadExecutor(r -> new Thread(r, expectedName)); TopicProcessor<Object> processor = TopicProcessor.builder() .executor(Executors.newCachedThreadPool()) .requestTaskExecutor(customTaskExecutor) .bufferSize(8) .waitStrategy(WaitStrategy.liteBlocking()) .autoCancel(true) .build(); processor.requestTask(Operators.cancelledSubscription()); Thread[] threads = new Thread[Thread.activeCount()]; Thread.enumerate(threads); //cleanup to avoid visibility in other tests customTaskExecutor.shutdownNow(); processor.forceShutdown(); Condition<Thread> customRequestTaskThread = new Condition<>( thread -> thread != null && expectedName.equals(thread.getName()), "a thread named \"%s\"", expectedName); Assertions.assertThat(threads) .haveExactly(1, customRequestTaskThread); }
@Test public void testCustomRequestTaskThreadShare() { String expectedName = "topicProcessorRequestTaskShare"; //NOTE: the below single executor should not be used usually as requestTask assumes it immediately gets executed ExecutorService customTaskExecutor = Executors.newSingleThreadExecutor(r -> new Thread(r, expectedName)); TopicProcessor<Object> processor = TopicProcessor.builder().share(true) .executor(Executors.newCachedThreadPool()) .requestTaskExecutor(customTaskExecutor) .bufferSize(8) .waitStrategy(WaitStrategy.liteBlocking()) .autoCancel(true) .build(); processor.requestTask(Operators.cancelledSubscription()); Thread[] threads = new Thread[Thread.activeCount()]; Thread.enumerate(threads); //cleanup to avoid visibility in other tests customTaskExecutor.shutdownNow(); processor.forceShutdown(); Condition<Thread> customRequestTaskThread = new Condition<>( thread -> thread != null && expectedName.equals(thread.getName()), "a thread named \"%s\"", expectedName); Assertions.assertThat(threads) .haveExactly(1, customRequestTaskThread); }
@Test public void shareOverrideAll() { ExecutorService executor = Executors.newSingleThreadExecutor(); ExecutorService requestTaskExecutor = Executors.newSingleThreadExecutor(); int bufferSize = 1024; WaitStrategy waitStrategy = WaitStrategy.busySpin(); boolean autoCancel = false; TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .share(true) .executor(executor) .requestTaskExecutor(requestTaskExecutor) .bufferSize(bufferSize) .waitStrategy(waitStrategy) .autoCancel(autoCancel) .build(); assertProcessor(processor, true, null, bufferSize, waitStrategy, autoCancel, executor, requestTaskExecutor); }
@Test public void createOverrideAll() { ExecutorService executor = Executors.newSingleThreadExecutor(); ExecutorService requestTaskExecutor = Executors.newSingleThreadExecutor(); int bufferSize = 1024; WaitStrategy waitStrategy = WaitStrategy.busySpin(); boolean autoCancel = false; TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .executor(executor) .requestTaskExecutor(requestTaskExecutor) .bufferSize(bufferSize) .waitStrategy(waitStrategy) .autoCancel(autoCancel) .build(); assertProcessor(processor, false, null, bufferSize, waitStrategy, autoCancel, executor, requestTaskExecutor); }
@Test public void shareOverrideExecutorBufferSizeWaitStrategyAutoCancel() { ExecutorService executor = Executors.newSingleThreadExecutor(); int bufferSize = 1024; WaitStrategy waitStrategy = WaitStrategy.busySpin(); boolean autoCancel = false; TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .share(true) .executor(executor) .bufferSize(bufferSize) .waitStrategy(waitStrategy) .autoCancel(autoCancel) .build(); assertProcessor(processor, true, null, bufferSize, waitStrategy, autoCancel, executor, null); }
@Test public void createOverrideExecutorBufferSizeWaitStrategyAutoCancel() { ExecutorService executor = Executors.newSingleThreadExecutor(); int bufferSize = 1024; WaitStrategy waitStrategy = WaitStrategy.busySpin(); boolean autoCancel = false; TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .executor(executor) .bufferSize(bufferSize) .waitStrategy(waitStrategy) .autoCancel(autoCancel) .build(); assertProcessor(processor, false, null, bufferSize, waitStrategy, autoCancel, executor, null); }
@Test public void shareOverrideExecutorBufferSizeAutoCancel() { ExecutorService executor = Executors.newSingleThreadExecutor(); int bufferSize = 1024; boolean autoCancel = false; TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .share(true) .executor(executor) .bufferSize(bufferSize) .autoCancel(autoCancel) .build(); assertProcessor(processor, true, null, bufferSize, null, autoCancel, executor, null); }
@Test public void shareOverrideExecutorBufferSizeWaitStrategy() { ExecutorService executor = Executors.newSingleThreadExecutor(); int bufferSize = 1024; WaitStrategy waitStrategy = WaitStrategy.busySpin(); TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .share(true) .executor(executor) .bufferSize(bufferSize) .waitStrategy(waitStrategy) .build(); assertProcessor(processor, true, null, bufferSize, waitStrategy, null, executor, null); }
@Test public void createOverrideExecutorBufferSizeAutoCancel() { ExecutorService executor = Executors.newSingleThreadExecutor(); int bufferSize = 1024; boolean autoCancel = false; TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .executor(executor) .bufferSize(bufferSize) .autoCancel(autoCancel) .build(); assertProcessor(processor, false, null, bufferSize, null, autoCancel, executor, null); }
@Test public void shareOverrideExecutorAutoCancel() { ExecutorService executor = Executors.newSingleThreadExecutor(); boolean autoCancel = false; TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .share(true) .executor(executor) .autoCancel(autoCancel) .build(); assertProcessor(processor, true, null, null, null, autoCancel, executor, null); }
@Test public void createOverrideExecutorBufferSizeWaitStrategy() { ExecutorService executor = Executors.newSingleThreadExecutor(); int bufferSize = 1024; WaitStrategy waitStrategy = WaitStrategy.busySpin(); TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .executor(executor) .bufferSize(bufferSize) .waitStrategy(waitStrategy) .build(); assertProcessor(processor, false, null, bufferSize, waitStrategy, null, executor, null); }
@Test public void createOverrideExecutor() { ExecutorService executor = Executors.newSingleThreadExecutor(); TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .executor(executor) .build(); assertProcessor(processor, false, null, null, null, null, executor, null); }
@Test public void shareOverrideExecutor() { ExecutorService executor = Executors.newSingleThreadExecutor(); TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .share(true) .executor(executor) .build(); assertProcessor(processor, true, null, null, null, null, executor, null); }
@Test public void createOverrideExecutorBufferSize() { ExecutorService executor = Executors.newSingleThreadExecutor(); int bufferSize = 1024; TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .executor(executor) .bufferSize(bufferSize) .build(); assertProcessor(processor, false, null, bufferSize, null, null, executor, null); }
@Test public void createOverrideExecutorAutoCancel() { ExecutorService executor = Executors.newSingleThreadExecutor(); boolean autoCancel = false; TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .executor(executor) .autoCancel(autoCancel) .build(); assertProcessor(processor, false, null, null, null, autoCancel, executor, null); }
@Test public void shareOverrideExecutorBufferSize() { ExecutorService executor = Executors.newSingleThreadExecutor(); int bufferSize = 1024; TopicProcessor<Integer> processor = TopicProcessor.<Integer>builder() .share(true) .executor(executor) .bufferSize(bufferSize) .build(); assertProcessor(processor, true, null, bufferSize, null, null, executor, null); }