EventHandlerGroup<T> createEventProcessors( final Sequence[] barrierSequences, final EventHandler<? super T>[] eventHandlers) { checkNotStarted(); final Sequence[] processorSequences = new Sequence[eventHandlers.length]; final SequenceBarrier barrier = ringBuffer.newBarrier(barrierSequences); for (int i = 0, eventHandlersLength = eventHandlers.length; i < eventHandlersLength; i++) { final EventHandler<? super T> eventHandler = eventHandlers[i]; final BatchEventProcessor<T> batchEventProcessor = new BatchEventProcessor<>(ringBuffer, barrier, eventHandler); if (exceptionHandler != null) { batchEventProcessor.setExceptionHandler(exceptionHandler); } consumerRepository.add(batchEventProcessor, eventHandler, barrier); processorSequences[i] = batchEventProcessor.getSequence(); } updateGatingSequencesForNextInChain(barrierSequences, processorSequences); return new EventHandlerGroup<>(this, consumerRepository, processorSequences); }
notifyStart(); try processEvents(); notifyShutdown(); running.set(IDLE); earlyExit();
notifyTimeout(sequence.get());
private void earlyExit() { notifyStart(); notifyShutdown(); }
@Test public void shouldAddEventProcessorsAfterPublishing() throws Exception { RingBuffer<TestEvent> rb = disruptor.getRingBuffer(); BatchEventProcessor<TestEvent> b1 = new BatchEventProcessor<TestEvent>( rb, rb.newBarrier(), new SleepingEventHandler()); BatchEventProcessor<TestEvent> b2 = new BatchEventProcessor<TestEvent>( rb, rb.newBarrier(b1.getSequence()), new SleepingEventHandler()); BatchEventProcessor<TestEvent> b3 = new BatchEventProcessor<TestEvent>( rb, rb.newBarrier(b2.getSequence()), new SleepingEventHandler()); assertThat(b1.getSequence().get(), is(-1L)); assertThat(b2.getSequence().get(), is(-1L)); assertThat(b3.getSequence().get(), is(-1L)); rb.publish(rb.next()); rb.publish(rb.next()); rb.publish(rb.next()); rb.publish(rb.next()); rb.publish(rb.next()); rb.publish(rb.next()); disruptor.handleEventsWith(b1, b2, b3); assertThat(b1.getSequence().get(), is(5L)); assertThat(b2.getSequence().get(), is(5L)); assertThat(b3.getSequence().get(), is(5L)); }
@Test public void shouldCallExceptionHandlerOnUncaughtException() throws Exception { CountDownLatch exceptionLatch = new CountDownLatch(1); LatchExceptionHandler latchExceptionHandler = new LatchExceptionHandler(exceptionLatch); final BatchEventProcessor<StubEvent> batchEventProcessor = new BatchEventProcessor<StubEvent>( ringBuffer, sequenceBarrier, new ExceptionEventHandler()); ringBuffer.addGatingSequences(batchEventProcessor.getSequence()); batchEventProcessor.setExceptionHandler(latchExceptionHandler); Thread thread = new Thread(batchEventProcessor); thread.start(); ringBuffer.publish(ringBuffer.next()); assertTrue(exceptionLatch.await(2, TimeUnit.SECONDS)); batchEventProcessor.halt(); thread.join(); }
new BatchEventProcessor<StubEvent>(ringBuffer, ringBuffer.newBarrier(), handler1); new BatchEventProcessor<StubEvent>(ringBuffer, ringBuffer.newBarrier(processor1.getSequence()), handler2); ringBuffer.addGatingSequences(processor1.getSequence(), processor2.getSequence()); processor2.halt(); ringBuffer.removeGatingSequence(processor2.getSequence());
@Override public EventProcessor createEventProcessor( final RingBuffer<TestEvent> ringBuffer, final Sequence[] barrierSequences) { assertEquals("Should not have had any barrier sequences", 0, barrierSequences.length); return new BatchEventProcessor<TestEvent>( disruptor.getRingBuffer(), ringBuffer.newBarrier( barrierSequences), eventHandler); } });
@Test(expected = NullPointerException.class) public void shouldThrowExceptionOnSettingNullExceptionHandler() { final BatchEventProcessor<StubEvent> batchEventProcessor = new BatchEventProcessor<StubEvent>( ringBuffer, sequenceBarrier, new ExceptionEventHandler()); batchEventProcessor.setExceptionHandler(null); }
new BatchEventProcessor<StubEvent>( ringBuffer, sequenceBarrier, new LoopbackEventHandler()); eventLatch.await(); batchEventProcessor.halt(); thread.join();
notifyStart(); notifyTimeout(sequence.get()); notifyShutdown(); running.set(false);
/** * Specify the {@link ExceptionHandler} to use with the event handler. * * @param exceptionHandler the exception handler to use. */ @SuppressWarnings("unchecked") public void with(ExceptionHandler<? super T> exceptionHandler) { final EventProcessor eventProcessor = consumerRepository.getEventProcessorFor(eventHandler); if (eventProcessor instanceof BatchEventProcessor) { ((BatchEventProcessor<T>) eventProcessor).setExceptionHandler(exceptionHandler); consumerRepository.getBarrierFor(eventHandler).alert(); } else { throw new RuntimeException( "EventProcessor: " + eventProcessor + " is not a BatchEventProcessor " + "and does not support exception handlers"); } } }
public void subscribe(URI uri, ChannelConnection connection) { if (ringBuffer == null) { subscribers.put(uri, connection); } else { // ring buffer already started, add dynamically ChannelEventHandler handler = new ChannelEventHandler(connection); SequenceBarrier barrier = ringBuffer.newBarrier(); BatchEventProcessor<RingBufferEvent> processor = new BatchEventProcessor<RingBufferEvent>(ringBuffer, barrier, handler); Sequence sequence = processor.getSequence(); sequenceGroup.addWhileRunning(ringBuffer, sequence); executorService.execute(processor); sequences.put(uri, sequence); subscribers.put(uri, connection); } }
@Test public void shouldReportProgressByUpdatingSequenceViaCallback() throws Exception { final RingBuffer<StubEvent> ringBuffer = createMultiProducer(StubEvent.EVENT_FACTORY, 16); final SequenceBarrier sequenceBarrier = ringBuffer.newBarrier(); final SequenceReportingEventHandler<StubEvent> handler = new TestSequenceReportingEventHandler(); final BatchEventProcessor<StubEvent> batchEventProcessor = new BatchEventProcessor<StubEvent>( ringBuffer, sequenceBarrier, handler); ringBuffer.addGatingSequences(batchEventProcessor.getSequence()); Thread thread = new Thread(batchEventProcessor); thread.setDaemon(true); thread.start(); assertEquals(-1L, batchEventProcessor.getSequence().get()); ringBuffer.publish(ringBuffer.next()); callbackLatch.await(); assertEquals(0L, batchEventProcessor.getSequence().get()); onEndOfBatchLatch.countDown(); assertEquals(0L, batchEventProcessor.getSequence().get()); batchEventProcessor.halt(); thread.join(); }
@Override public EventProcessor createEventProcessor( final RingBuffer<TestEvent> ringBuffer, final Sequence[] barrierSequences) { assertSame("Should have had a barrier sequence", 1, barrierSequences.length); return new BatchEventProcessor<TestEvent>( disruptor.getRingBuffer(), ringBuffer.newBarrier( barrierSequences), eventHandler); } });
final BatchEventProcessor p1 = new BatchEventProcessor<>(dp, barrier, h1); p1.halt(); t1.start(); final BatchEventProcessor p2 = new BatchEventProcessor<>(dp, barrier, h2); Thread t2 = new Thread(p2); t2.start(); p2.halt(); final BatchEventProcessor p2 = new BatchEventProcessor<>(dp, barrier, h2); Thread t2 = new Thread(p2); t2.start(); Thread.yield(); p2.halt();
notifyStart(); notifyTimeout(sequence.get()); notifyShutdown(); running.set(false);
/** * Specify the {@link ExceptionHandler} to use with the event handler. * * @param exceptionHandler the exception handler to use. */ @SuppressWarnings("unchecked") public void with(ExceptionHandler<? super T> exceptionHandler) { final EventProcessor eventProcessor = consumerRepository.getEventProcessorFor(eventHandler); if (eventProcessor instanceof BatchEventProcessor) { ((BatchEventProcessor<T>) eventProcessor).setExceptionHandler(exceptionHandler); consumerRepository.getBarrierFor(eventHandler).alert(); } else { throw new RuntimeException( "EventProcessor: " + eventProcessor + " is not a BatchEventProcessor " + "and does not support exception handlers"); } } }
private void earlyExit() { notifyStart(); notifyShutdown(); }
simpleParserStage = new BatchEventProcessor<MessageEvent>(disruptorMsgBuffer, sequenceBarrier, new SimpleParserStage(logContext)); simpleParserStage.setExceptionHandler(exceptionHandler); disruptorMsgBuffer.addGatingSequences(simpleParserStage.getSequence()); SequenceBarrier dmlParserSequenceBarrier = disruptorMsgBuffer.newBarrier(simpleParserStage.getSequence()); WorkHandler<MessageEvent>[] workHandlers = new DmlParserStage[parserThreadCount]; for (int i = 0; i < parserThreadCount; i++) { sinkStoreStage = new BatchEventProcessor<MessageEvent>(disruptorMsgBuffer, sinkSequenceBarrier, new SinkStoreStage()); sinkStoreStage.setExceptionHandler(exceptionHandler); disruptorMsgBuffer.addGatingSequences(sinkStoreStage.getSequence());