You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bsdgy-server/src/main/java/com/kiisoo/ic/common/AbstractMsgDisruptor.java

96 lines
2.0 KiB
Java

6 years ago
package com.kiisoo.ic.common;
import com.lmax.disruptor.BlockingWaitStrategy;
import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.dsl.Disruptor;
import com.lmax.disruptor.dsl.ProducerType;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
/**
* Disruptor
* Created by hc on 2019/10/22
*/
@Setter
@Getter
@Slf4j
public abstract class AbstractMsgDisruptor {
/**
*
*/
Disruptor<MsgEvent> disruptor;
/**
*
*/
MsgEventProducer producer;
/**
*
*/
@PostConstruct
public void init(){
String name = getName();
ThreadFactory producerFactory = Executors.defaultThreadFactory();
// 创建缓冲池
MsgEventFactory eventFactory = new MsgEventFactory();
disruptor = new Disruptor<>(eventFactory, getRingBufferSize(), producerFactory,
ProducerType.SINGLE, new BlockingWaitStrategy());
RingBuffer<MsgEvent> ringBuffer = disruptor.getRingBuffer();
disruptor.handleEventsWithWorkerPool(getMsgEventHandle());
disruptor.start();
producer = new MsgEventProducer(ringBuffer);
}
/**
*
*/
@PreDestroy
public void close(){
disruptor.shutdown();
}
/**
*
* @param dataMsg
*/
public void send(DisruptorDataI dataMsg){
producer.onData(dataMsg);
}
/**
*
* 2N
* @return
*/
public abstract int getRingBufferSize();
/**
*
* Woker()
* @return woker
*/
public abstract AbstractMsgEventHandler[] getMsgEventHandle();
/**
*
*/
public abstract String getName();
}