package examples.analysis; import static java.util.concurrent.TimeUnit.SECONDS; import static uk.co.acuminous.julez.util.JulezSugar.SCENARIOS_ARE_DEQUEUED_BUT_NOT_STARTED; import static uk.co.acuminous.julez.util.JulezSugar.THREADS; import org.junit.Test; import uk.co.acuminous.julez.event.handler.ThroughputMonitor; import uk.co.acuminous.julez.event.pipe.AsynchronousPipe; import uk.co.acuminous.julez.event.pipe.EventPipe; import uk.co.acuminous.julez.event.pipe.FanOutPipe; import uk.co.acuminous.julez.runner.ConcurrentScenarioRunner; import uk.co.acuminous.julez.scenario.limiter.InLimboLimiter; import uk.co.acuminous.julez.scenario.source.ScenarioRepeater; import uk.co.acuminous.julez.test.NoOpScenario; import uk.co.acuminous.julez.util.ConcurrencyUtils; public class AsynchronousAnalysisTest { @Test public void demonstrateAsynchronousAnalysis() { ThroughputMonitor throughputMonitor = new ThroughputMonitor(); EventPipe asynchronousPipe = new AsynchronousPipe().register(throughputMonitor); Thread monitorThread = detach(throughputMonitor); NoOpScenario scenario = new NoOpScenario(); InLimboLimiter limiter = new InLimboLimiter() .block(new ScenarioRepeater(scenario)) .when(5000, SCENARIOS_ARE_DEQUEUED_BUT_NOT_STARTED) .unblockWhen(2500, SCENARIOS_ARE_DEQUEUED_BUT_NOT_STARTED); scenario.register(new FanOutPipe(asynchronousPipe, limiter)); new ConcurrentScenarioRunner().register(asynchronousPipe).allocate(4, THREADS).queue(limiter).runFor(5, SECONDS).go(); monitorThread.interrupt(); } private Thread detach(final ThroughputMonitor throughputMonitor) { return ConcurrencyUtils.start(new Runnable() { @Override public void run() { boolean ok = true; while(ok) { System.out.println("Throughput: " + throughputMonitor.getThroughput()); try { Thread.sleep(1000); } catch (InterruptedException e) { ok = false; } } } }); } }