Chuỗi Disruptor Phần Ba - loc.club - cổng game quốc tế

Trước đây, tôi đã bị hiểu lầm một chút về cách hoạt động của gatingSequences. Ban đầu, tôi nghĩ rằng chúng chỉ đơn giản là để đánh dấu vị trí thao tác của mỗi processor, nhưng việc ghi nhận và cập nhật thông tin này lại không rõ ràng. Thực tế vấn đề nằm ở chỗ gatingSequences là một mảng các đối tượng Sequence. Để hiểu sâu hơn, ta cần xem xét cách mà những giá trị này được thêm vào.

Quá trình bắt đầu từ phương thức com.lmax.disruptor.RingBuffer#addGatingSequences. Đầu tiên, tin tức bóng đá bạn sẽ thấy rằng nó xuất hiện trong hàm com.lmax.disruptor.dsl.Disruptor#handleEventsWith(com.lmax.disruptor.EventHandler<? super T>...). Sau đó, phương thức bảng tỷ số bóng đá com.lmax.disruptor.dsl.Disruptor#createEventProcessors(com.lmax.disruptor.Sequence[], com.lmax.disruptor.EventHandler<? super T>[]) sẽ được gọi.

 1EventHandlerGroup<T> createEventProcessors(
 2    final Sequence[] barrierSequences,
 3    final EventHandler<? super T>[] eventHandlers) {
 4    checkNotStarted();
 5    final Sequence[] processorSequences = new Sequence[eventHandlers.length];
 6    final SequenceBarrier barrier = ringBuffer.newBarrier(barrierSequences);
 7    for (int i = 0, eventHandlersLength = eventHandlers.length; i < eventHandlersLength; i++) {
 8        final EventHandler<? super T> eventHandler = eventHandlers[i];
 9        // Tại đây, handler được bọc bởi BatchEventProcessor
10        final BatchEventProcessor<T> batchEventProcessor =
11            new BatchEventProcessor<>(ringBuffer, barrier, eventHandler);
12        if (exceptionHandler != null) {
13            batchEventProcessor.setExceptionHandler(exceptionHandler);
14        }
15        consumerRepository.add(batchEventProcessor, eventHandler, barrier);
16        processorSequences[i] = batchEventProcessor.getSequence();
17    }
18    updateGatingSequencesForNextInChain(barrierSequences, processorSequences);
19    return new EventHandlerGroup<>(this, consumerRepository, processorSequences);
20}