@Test public void testForceShutdownAfterShutdown() throws InterruptedException { WorkQueueProcessor<String> processor = WorkQueueProcessor.<String>builder() .name("processor").bufferSize(4) .waitStrategy(WaitStrategy.phasedOffLiteLock(200, 100, TimeUnit.MILLISECONDS)) //eliminate the waitstrategy diff .build(); Publisher<String> publisher = Flux.fromArray(new String[] { "1", "2", "3", "4", "5" }); publisher.subscribe(processor); AssertSubscriber<String> subscriber = AssertSubscriber.create(0); processor.subscribe(subscriber); subscriber.request(1); Thread.sleep(250); processor.shutdown(); assertFalse(processor.awaitAndShutdown(Duration.ofMillis(400))); processor.forceShutdown(); assertTrue(processor.awaitAndShutdown(Duration.ofMillis(400))); }
@Test public void testWorkQueueProcessorGetters() { final int TEST_BUFFER_SIZE = 16; WorkQueueProcessor<Object> processor = WorkQueueProcessor.builder().name("testProcessor").bufferSize(TEST_BUFFER_SIZE).build(); assertEquals(TEST_BUFFER_SIZE, processor.getAvailableCapacity()); processor.onNext(new Object()); assertEquals(TEST_BUFFER_SIZE - 1, processor.getAvailableCapacity()); processor.awaitAndShutdown(); }
@Override public Sink createSink(FlowConstruct flowConstruct, ReactiveProcessor function) { final long shutdownTimeout = flowConstruct.getMuleContext().getConfiguration().getShutdownTimeout(); WorkQueueProcessor<CoreEvent> processor = WorkQueueProcessor.<CoreEvent>builder().executor(ringBufferSchedulerSupplier.get()).bufferSize(bufferSize) .waitStrategy(waitStrategy.getReactorWaitStrategy()).build(); int subscriberCount = maxConcurrency < subscribers ? maxConcurrency : subscribers; CountDownLatch completionLatch = new CountDownLatch(subscriberCount); for (int i = 0; i < subscriberCount; i++) { processor.doOnSubscribe(subscription -> currentThread().setContextClassLoader(executionClassloader)).transform(function) .doFinally(s -> completionLatch.countDown()).subscribe(); } return new ReactorSink(processor.sink(), () -> { long start = currentTimeMillis(); if (!processor.awaitAndShutdown(ofMillis(shutdownTimeout))) { processor.forceShutdown(); } try { completionLatch.await(max(start - currentTimeMillis() + shutdownTimeout, 0l), MILLISECONDS); } catch (InterruptedException e) { currentThread().interrupt(); throw new MuleRuntimeException(e); } }, createOnEventConsumer(), bufferSize); }