public class TimelineBarrier extends java.lang.Object implements GroupBarrier<Event>
大致设计: 1. 多个队列都提交一个timestamp,判断出最小的一个timestamp做为通过的条件,然后唤醒<=该最小时间的线程通过 2. 只有当多个队列都提交了一个timestamp,缺少任何一个提交,都会阻塞其他队列通过。(解决当一个库启动过慢或者发生主备切换时出现延迟等问题) 存在一个假定,认为提交的timestamp是一个顺序递增,但是在两种case下会出现时间回退 a. 大事务时,事务头的时间会晚于事务当中数据的时间,相当于出现一个时间回退 b. 出现主备切换,从备机上发过来的数据会回退几秒钟
| 限定符和类型 | 字段和说明 |
|---|---|
protected java.util.concurrent.locks.Condition |
condition |
protected int |
groupSize |
protected java.util.concurrent.BlockingQueue<java.lang.Long> |
lastTimestamps |
protected java.util.concurrent.locks.ReentrantLock |
lock |
protected long |
threshold |
| 构造器和说明 |
|---|
TimelineBarrier(int groupSize) |
| 限定符和类型 | 方法和说明 |
|---|---|
void |
await(Event event)
判断自己的timestamp是否可以通过
|
void |
await(Event event,
long timeout,
java.util.concurrent.TimeUnit unit)
判断自己的timestamp是否可以通过,带超时控制
|
void |
clear(Event event)
sink成功,清理对应barrier的状态
|
void |
interrupt()
出现切换,发起interrupt,清理对应的上下文
|
protected boolean |
isPermit(Event event,
long state)
判断是否允许通过
|
protected void |
notify(long minTimestamp)
通知一下
|
long |
state() |
protected int groupSize
protected java.util.concurrent.locks.ReentrantLock lock
protected java.util.concurrent.locks.Condition condition
protected volatile long threshold
protected java.util.concurrent.BlockingQueue<java.lang.Long> lastTimestamps
public void await(Event event) throws java.lang.InterruptedException
await 在接口中 GroupBarrier<Event>java.lang.InterruptedExceptionpublic void await(Event event, long timeout, java.util.concurrent.TimeUnit unit) throws java.lang.InterruptedException, java.util.concurrent.TimeoutException
await 在接口中 GroupBarrier<Event>java.lang.InterruptedExceptionjava.util.concurrent.TimeoutExceptionpublic void clear(Event event)
GroupBarrierclear 在接口中 GroupBarrier<Event>public void interrupt()
GroupBarrierinterrupt 在接口中 GroupBarrier<Event>public long state()
protected boolean isPermit(Event event, long state)
protected void notify(long minTimestamp)
Copyright © 2019. All rights reserved.