@Slf4j
@Component
public class BlockQueueDemo {
private BlockQueueDemo blockInstance;
@Autowired
private ObjectWriter witer;
private BlockingQueue<Object> quene;
public BlockQueueDemo() {
blockInstance = this;
quene = new LinkedBlockingQueue<>();
}
/**
* 数据加入到队列
*/
public void add(String data, JSONObject data) {
if (blockInstance == null) {
return;
}
Object obj = blockInstance.setData(data, data);
if (blockInstance.quene.size() > 10000000) { //防止内存溢出
return;
}
blockInstance.quene.add(obj);
}
private Object setData(String dataId, JSONObject data) {
Object obj = new Object();
obj.setId(dataId);
obj.setdata(data);
return obj;
}
@PostConstruct该注解被用来修饰一个非静态的void()方法。
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,
并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
@PostConstruct
public void init() {
insertPool(); //消费数据消息队列线程
}
private void insertPool() {
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(() -> {
while (true) {
try {
// 从队列取出数据
Object obj = quene.take();
witer.insertDate(obj);
} catch (InterruptedException e) {
log.error(e.getMessage());
}
}
});
}
}