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}