Disruptor 3种EventProcessor实现类
来源:互联网 发布:中铁一局集团网络学校 编辑:程序博客网 时间:2024/06/02 16:25
BatchEventProcessor 一个消费者处理对象 表示一个消费者.
//获取下一个消费下标位置
long nextSequence = sequence.get() + 1L;
//一直检查获取可以消费的产品位置.
while (true)
{
try
{
//获取消费产品位置 只有当可消费产品位置大于(nextSequence); 才返回availableSequence 否则等待
final long availableSequence = sequenceBarrier.waitFor(nextSequence);
//将nextSequence到availableSequence)之间的算一批,然后获取处理这批消费产品 交给消费者处理eventHandler
while (nextSequence <= availableSequence)
{
event = dataProvider.get(nextSequence);
eventHandler.onEvent(event, nextSequence, nextSequence == availableSequence);
nextSequence++;
}
//记录最后一次消费的位置
sequence.set(availableSequence);
}
catch (final TimeoutException e)
{
notifyTimeout(sequence.get());
}
catch (final AlertException ex)
{
if (!running.get())
{
break;
}
}
catch (final Throwable ex)
{
exceptionHandler.handleEventException(ex, nextSequence, event);
sequence.set(nextSequence);
nextSequence++;
}
}
WorkProcessor 是WorkerPool创建的WorkProcessor[]数组中的一个消费者.workSequence是WorkerPool中的一个传给每个WorkProcessor对象的公共者workSequence对象.
主要是让多个WorkProcessor通过nextSequence = workSequence.get() + 1L;获取nextSequence值,然后通过cas竞争,看哪个WorkProcessor消费者抢到将workSequence更新为nextSequence 值,抢到的表示他获取了这个消费位置.
这样所有WorkProcessor都会通过竞争获取到一个nextSequence 消费位置.
相当于所有WorkProcessor最开始都会去竞争获取一个nextSequence,抢不到继续抢,
当WorkProcessor获取了该值后会与生产者生产位置achedAvailableSequence比较,
是否存在可以消费的产品,存在通过则event = ringBuffer.get(nextSequence);
获取可以消费的产品,然后通过workHandler.onEvent(event);来实现消费部分逻辑.
假如生产者还没有生产可用产品(生产位置还没有大于消费位置)还未超过消费者消费位置,
则消费者 通过sequenceBarrier.waitFor(nextSequence);等待生产者超过消费位置,并获取cachedAvailableSequence 当前生产者当前位置,
然后再次if (cachedAvailableSequence >= nextSequence) 判断生产者位置是否大于消费者位置,大于则获取nextSequence所代表位置的产品,
并消费掉该产品,然后由重新回来抢nextSequence下一个消费位置.
boolean processedSequence = true;
long cachedAvailableSequence = Long.MIN_VALUE;
//获取记录消费者位置 默认-1
long nextSequence = sequence.get();
T event = null;
while (true)
{
try
{
// if previous sequence was processed - fetch the next sequence and set
// that we have successfully processed the previous sequence
// typically, this will be true
// this prevents the sequence getting too far forward if an exception
// is thrown from the WorkHandler
//多个WorkProcessor
if (processedSequence)
{
processedSequence = false;
do
{
nextSequence = workSequence.get() + 1L;
sequence.set(nextSequence - 1L);
}
while (!workSequence.compareAndSet(nextSequence - 1L, nextSequence));
}
if (cachedAvailableSequence >= nextSequence)
{
event = ringBuffer.get(nextSequence);
workHandler.onEvent(event);
processedSequence = true;
}
else
{
cachedAvailableSequence = sequenceBarrier.waitFor(nextSequence);
}
}
catch (final AlertException ex)
{
if (!running.get())
{
break;
}
}
catch (final Throwable ex)
{
// handle, mark as processed, unless the exception handler threw an exception
exceptionHandler.handleEventException(ex, nextSequence, event);
processedSequence = true;
}
}
NoOpEventProcessor
@Override
public void run()
{
if (!running.compareAndSet(false, true))
{
throw new IllegalStateException("Thread is already running");
}
}
并没有做什么事情
//获取下一个消费下标位置
long nextSequence = sequence.get() + 1L;
//一直检查获取可以消费的产品位置.
while (true)
{
try
{
//获取消费产品位置 只有当可消费产品位置大于(nextSequence); 才返回availableSequence 否则等待
final long availableSequence = sequenceBarrier.waitFor(nextSequence);
//将nextSequence到availableSequence)之间的算一批,然后获取处理这批消费产品 交给消费者处理eventHandler
while (nextSequence <= availableSequence)
{
event = dataProvider.get(nextSequence);
eventHandler.onEvent(event, nextSequence, nextSequence == availableSequence);
nextSequence++;
}
//记录最后一次消费的位置
sequence.set(availableSequence);
}
catch (final TimeoutException e)
{
notifyTimeout(sequence.get());
}
catch (final AlertException ex)
{
if (!running.get())
{
break;
}
}
catch (final Throwable ex)
{
exceptionHandler.handleEventException(ex, nextSequence, event);
sequence.set(nextSequence);
nextSequence++;
}
}
WorkProcessor 是WorkerPool创建的WorkProcessor[]数组中的一个消费者.workSequence是WorkerPool中的一个传给每个WorkProcessor对象的公共者workSequence对象.
主要是让多个WorkProcessor通过nextSequence = workSequence.get() + 1L;获取nextSequence值,然后通过cas竞争,看哪个WorkProcessor消费者抢到将workSequence更新为nextSequence 值,抢到的表示他获取了这个消费位置.
这样所有WorkProcessor都会通过竞争获取到一个nextSequence 消费位置.
相当于所有WorkProcessor最开始都会去竞争获取一个nextSequence,抢不到继续抢,
当WorkProcessor获取了该值后会与生产者生产位置achedAvailableSequence比较,
是否存在可以消费的产品,存在通过则event = ringBuffer.get(nextSequence);
获取可以消费的产品,然后通过workHandler.onEvent(event);来实现消费部分逻辑.
假如生产者还没有生产可用产品(生产位置还没有大于消费位置)还未超过消费者消费位置,
则消费者 通过sequenceBarrier.waitFor(nextSequence);等待生产者超过消费位置,并获取cachedAvailableSequence 当前生产者当前位置,
然后再次if (cachedAvailableSequence >= nextSequence) 判断生产者位置是否大于消费者位置,大于则获取nextSequence所代表位置的产品,
并消费掉该产品,然后由重新回来抢nextSequence下一个消费位置.
boolean processedSequence = true;
long cachedAvailableSequence = Long.MIN_VALUE;
//获取记录消费者位置 默认-1
long nextSequence = sequence.get();
T event = null;
while (true)
{
try
{
// if previous sequence was processed - fetch the next sequence and set
// that we have successfully processed the previous sequence
// typically, this will be true
// this prevents the sequence getting too far forward if an exception
// is thrown from the WorkHandler
//多个WorkProcessor
if (processedSequence)
{
processedSequence = false;
do
{
nextSequence = workSequence.get() + 1L;
sequence.set(nextSequence - 1L);
}
while (!workSequence.compareAndSet(nextSequence - 1L, nextSequence));
}
if (cachedAvailableSequence >= nextSequence)
{
event = ringBuffer.get(nextSequence);
workHandler.onEvent(event);
processedSequence = true;
}
else
{
cachedAvailableSequence = sequenceBarrier.waitFor(nextSequence);
}
}
catch (final AlertException ex)
{
if (!running.get())
{
break;
}
}
catch (final Throwable ex)
{
// handle, mark as processed, unless the exception handler threw an exception
exceptionHandler.handleEventException(ex, nextSequence, event);
processedSequence = true;
}
}
NoOpEventProcessor
@Override
public void run()
{
if (!running.compareAndSet(false, true))
{
throw new IllegalStateException("Thread is already running");
}
}
并没有做什么事情
0 0
- Disruptor 3种EventProcessor实现类
- Disruptor官方文档实现
- Disruptor无锁ringbuff实现
- Disruptor 实现无锁队列
- Disruptor
- disruptor
- disruptor
- disruptor
- disruptor
- disruptor
- Disruptor
- Disruptor
- Disruptor
- Disruptor
- Disruptor
- Disruptor
- Disruptor
- disruptor
- 基于流形距离的聚类算法
- Single Number II
- xml解析错误:UTFDataFormatException: invalid byte 2 of 2-byte UTF-8 sequence (0xfd)
- POJ 2075 Tangled in Cables (c++/java)
- 4.1.2 Longest Valid Parentheses
- Disruptor 3种EventProcessor实现类
- 地火明夷
- 如何选项目?
- Android studio for mac 安装
- Python 对Twitter中指定话题的被转载Tweet数量的频谱分析
- 3Sum
- Spring容器初始化
- Direct3D 纹理使用
- 程序员生存定律--表达背后的力量(1)