Disruptor

参考文章:
https://tech.meituan.com/2016/11/18/disruptor.html
https://www.cnblogs.com/pku-liuqiang/p/8544700.html

定义Disruptor

@Component
@Slf4j
public class DisruptorUtil {

	private static int bufferSize = 4096;

	/**
	 * 单生产者
	 */
	public Disruptor<PairEvent> getSingleDisruptor() {
		return new Disruptor<>(PairEvent::new, bufferSize, DaemonThreadFactory.INSTANCE);
	}

	/**
	 * 多生产者
	 */
	public Disruptor<PairEvent> getMultiDisruptor() {
		return new Disruptor<>(PairEvent::new, bufferSize, DaemonThreadFactory.INSTANCE, ProducerType.MULTI, new BlockingWaitStrategy());
	}

}

定义事件对象

/**
 * 每次向disruptor中添加元素时的事件对象
 * 这里添加的是Pair类型
 */
public class PairEvent {

	private Pair<String, String> pair;

	public void set(Pair<String, String> pair){
		this.pair = pair;
	}

	public Pair<String, String> get(){
		return this.pair;
	}
}

使用流程

	public Boolean recoverWork(String table, String fieldBind, Long timeStamp) {

		Disruptor<PairEvent> disruptor = disruptorUtil.getSingleDisruptor();

		WorkHandler<PairEvent> handler = new WorkHandler<PairEvent>() {
			@Override
			public void onEvent(PairEvent pairEvent) throws Exception {
				Pair<String, String> data = pairEvent.get();
				String key = data.getLeft();
				String value = data.getRight();
				Pair<String, String> pair = valueBuildUtil.valueSplit(value);

				TriConsumer<String, String, String> operateConsumer = opMap.get(pair.getLeft());
				Preconditions.checkArgument(operateConsumer != null, "recoverWork Error,没有对应的数据恢复类型: %s", pair.getLeft());
				operateConsumer.accept(key, pair.getRight(), fieldBind);
			}
		};

		//设置多个消费者,互斥消费
		disruptor.handleEventsWithWorkerPool(handler, handler, handler, handler);

		//启动
		disruptor.start();

		Iterable<String> keys = cacheClient.getKeys(table + ":*", 15);

		RingBuffer<PairEvent> ringBuffer = disruptor.getRingBuffer();

		for (String key : keys) {
			long sequence = ringBuffer.next();
			try {
				PairEvent event = ringBuffer.get(sequence);
				Set<String> valueSet = cacheClient.getFromSet(key);
				ArrayList<String> valueList = Lists.newArrayList(valueSet);
				Collections.sort(valueList);
				for (String value : valueList) {
					Pair<String, String> splitValue = valueBuildUtil.valueSplit(value);
					if (Long.parseLong(splitValue.getLeft()) >= timeStamp) {
						event.set(Pair.of(key, splitValue.getRight()));
						break;
					}
				}
			}
			finally {
				ringBuffer.publish(sequence);
			}
		}
		return true;
	}

你可能感兴趣的:(框架入门,阻塞队列,生产者消费者模式,disruptor)