import lombok.Setter;
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;
import javax.annotation.PostConstruct;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Consumer;
public abstract class ConsumeModeService {
/**
- 独立消费者数量
*/
public static final int INDEPENDENT_CONSUMER_NUM = 2;
/**
- 环形缓冲区大小
*/
protected int BUFFER_SIZE = 16;
protected Disruptor disruptor;
@Setter
private OrderEventProducer producer;
/**
- 统计消息总数
*/
protected final AtomicLong eventCount = new AtomicLong();
/**
-
这是辅助测试用的,
-
测试的时候,完成事件发布后,测试主线程就用这个countDownLatch开始等待,
-
在消费到指定的数量(countDownLatchGate)后,消费线程执行countDownLatch的countDown方法,
-
这样测试主线程就可以结束等待了
*/
private CountDownLatch countDownLatch;
/**
-
这是辅助测试用的,
-
测试的时候,完成事件发布后,测试主线程就用这个countDownLatch开始等待,
-
在消费到指定的数量(countDownLatchGate)后,消费线程执行countDownLatch的countDown方法,
-
这样测试主线程就可以结束等待了
*/
private int countDownLatchGate;
/**
-
准备一个匿名类,传给disruptor的事件处理类,
-
这样每次处理事件时,都会将已经处理事件的总数打印出来
*/
protected Consumer<?> eventCountPrinter = new Consumer() {
@Override
public void accept(Object o) {
long count = eventCount.incrementAndGet();
/**
-
这是辅助测试用的,
-
测试的时候,完成事件发布后,测试主线程就用这个countDownLatch开始等待,
-
在消费到指定的数量(countDownLatchGate)后,消费线程执行countDownLatch的countDown方法,
-
这样测试主线程就可以结束等待了
*/
if (null!=countDownLatch && count>=countDownLatchGate) {
countDownLatch.countDown();
}
}
};
/**
-
发布一个事件
-
@param value
-
@return
*/
public void publish(String value) {
producer.onData(value);
}
/**
-
返回已经处理的任务总数
-
@return
*/
public long eventCount() {
return eventCount.get();
}
/**
-
这是辅助测试用的,
-
测试的时候,完成事件发布后,测试主线程就用这个countDownLatch开始等待,
-
在消费到指定的数量(countDownLatchGate)后,消费线程执行countDownLatch的countDown方法,
-
这样测试主线程就可以结束等待了
-
@param co