use of com.lmax.disruptor.dsl.Disruptor in project disruptor by LMAX-Exchange.
the class DisruptorStressTest method shouldHandleLotsOfThreads.
@Test
public void shouldHandleLotsOfThreads() throws Exception {
Disruptor<TestEvent> disruptor = new Disruptor<TestEvent>(TestEvent.FACTORY, 1 << 16, DaemonThreadFactory.INSTANCE, ProducerType.MULTI, new BusySpinWaitStrategy());
RingBuffer<TestEvent> ringBuffer = disruptor.getRingBuffer();
disruptor.setDefaultExceptionHandler(new FatalExceptionHandler());
int threads = max(1, Runtime.getRuntime().availableProcessors() / 2);
int iterations = 200000;
int publisherCount = threads;
int handlerCount = threads;
CyclicBarrier barrier = new CyclicBarrier(publisherCount);
CountDownLatch latch = new CountDownLatch(publisherCount);
TestEventHandler[] handlers = initialise(disruptor, new TestEventHandler[handlerCount]);
Publisher[] publishers = initialise(new Publisher[publisherCount], ringBuffer, iterations, barrier, latch);
disruptor.start();
for (Publisher publisher : publishers) {
executor.execute(publisher);
}
latch.await();
while (ringBuffer.getCursor() < (iterations - 1)) {
LockSupport.parkNanos(1);
}
disruptor.shutdown();
for (Publisher publisher : publishers) {
assertThat(publisher.failed, is(false));
}
for (TestEventHandler handler : handlers) {
assertThat(handler.messagesSeen, is(not(0)));
assertThat(handler.failureCount, is(0));
}
}
use of com.lmax.disruptor.dsl.Disruptor in project disruptor by LMAX-Exchange.
the class WorkerStressTest method shouldHandleLotsOfThreads.
@Test
public void shouldHandleLotsOfThreads() throws Exception {
Disruptor<TestEvent> disruptor = new Disruptor<TestEvent>(TestEvent.FACTORY, 1 << 16, DaemonThreadFactory.INSTANCE, ProducerType.MULTI, new SleepingWaitStrategy());
RingBuffer<TestEvent> ringBuffer = disruptor.getRingBuffer();
disruptor.setDefaultExceptionHandler(new FatalExceptionHandler());
int threads = max(1, Runtime.getRuntime().availableProcessors() / 2);
int iterations = 200000;
int publisherCount = threads;
int handlerCount = threads;
CyclicBarrier barrier = new CyclicBarrier(publisherCount);
CountDownLatch latch = new CountDownLatch(publisherCount);
TestWorkHandler[] handlers = initialise(new TestWorkHandler[handlerCount]);
Publisher[] publishers = initialise(new Publisher[publisherCount], ringBuffer, iterations, barrier, latch);
disruptor.handleEventsWithWorkerPool(handlers);
disruptor.start();
for (Publisher publisher : publishers) {
executor.execute(publisher);
}
latch.await();
while (ringBuffer.getCursor() < (iterations - 1)) {
LockSupport.parkNanos(1);
}
disruptor.shutdown();
for (Publisher publisher : publishers) {
assertThat(publisher.failed, is(false));
}
for (TestWorkHandler handler : handlers) {
assertThat(handler.seen, is(not(0)));
}
}
use of com.lmax.disruptor.dsl.Disruptor in project disruptor by LMAX-Exchange.
the class MultiProducerWithTranslator method main.
public static void main(String[] args) throws InterruptedException {
Disruptor<ObjectBox> disruptor = new Disruptor<ObjectBox>(ObjectBox.FACTORY, RING_SIZE, DaemonThreadFactory.INSTANCE, ProducerType.MULTI, new BlockingWaitStrategy());
disruptor.handleEventsWith(new Consumer()).then(new Consumer());
final RingBuffer<ObjectBox> ringBuffer = disruptor.getRingBuffer();
Publisher p = new Publisher();
IMessage message = new IMessage();
ITransportable transportable = new ITransportable();
String streamName = "com.lmax.wibble";
System.out.println("publishing " + RING_SIZE + " messages");
for (int i = 0; i < RING_SIZE; i++) {
ringBuffer.publishEvent(p, message, transportable, streamName);
Thread.sleep(10);
}
System.out.println("start disruptor");
disruptor.start();
System.out.println("continue publishing");
while (true) {
ringBuffer.publishEvent(p, message, transportable, streamName);
Thread.sleep(10);
}
}
use of com.lmax.disruptor.dsl.Disruptor in project disruptor by LMAX-Exchange.
the class WaitForShutdown method main.
public static void main(String[] args) throws TimeoutException, InterruptedException {
Disruptor<LongEvent> disruptor = new Disruptor<LongEvent>(LongEvent.FACTORY, 16, DaemonThreadFactory.INSTANCE);
CountDownLatch shutdownLatch = new CountDownLatch(2);
disruptor.handleEventsWith(new Handler(shutdownLatch)).then(new Handler(shutdownLatch));
disruptor.start();
long next = disruptor.getRingBuffer().next();
disruptor.getRingBuffer().get(next).set(next);
disruptor.getRingBuffer().publish(next);
disruptor.shutdown(10, TimeUnit.SECONDS);
shutdownLatch.await();
System.out.println(value);
}
use of com.lmax.disruptor.dsl.Disruptor in project disruptor by LMAX-Exchange.
the class DynamiclyAddHandler method main.
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newCachedThreadPool(DaemonThreadFactory.INSTANCE);
// Build a disruptor and start it.
Disruptor<StubEvent> disruptor = new Disruptor<StubEvent>(StubEvent.EVENT_FACTORY, 1024, DaemonThreadFactory.INSTANCE);
RingBuffer<StubEvent> ringBuffer = disruptor.start();
// Construct 2 batch event processors.
DynamicHandler handler1 = new DynamicHandler();
BatchEventProcessor<StubEvent> processor1 = new BatchEventProcessor<StubEvent>(ringBuffer, ringBuffer.newBarrier(), handler1);
DynamicHandler handler2 = new DynamicHandler();
BatchEventProcessor<StubEvent> processor2 = new BatchEventProcessor<StubEvent>(ringBuffer, ringBuffer.newBarrier(processor1.getSequence()), handler2);
// Dynamically add both sequences to the ring buffer
ringBuffer.addGatingSequences(processor1.getSequence(), processor2.getSequence());
// Start the new batch processors.
executor.execute(processor1);
executor.execute(processor2);
// Remove a processor.
// Stop the processor
processor2.halt();
// Wait for shutdown the complete
handler2.awaitShutdown();
// Remove the gating sequence from the ring buffer
ringBuffer.removeGatingSequence(processor2.getSequence());
}
Aggregations