importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.stereotype.Component;importjavax.annotation.PostConstruct;importjavax.annotation.PreDestroy;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.Future;importjava.util.concurrent.LinkedBlockingQueue;
@Componentpublic classQueueGenerationService{//日志监控
private static final Logger log = LoggerFactory.getLogger(QueueGenerationService.class);//根据业务与服务器性能自行配置 这里我配置的是最多50000个任务//LinkedBlockingQueue构造的时候若没有指定大小,则默认大小为Integer.MAX_VALUE
private final LinkedBlockingQueue tasks = new LinkedBlockingQueue(50000);//类似于一个线程总管 保证所有的任务都在队列之中
private ExecutorService service =Executors.newSingleThreadExecutor();//检查服务是否运行
private volatile boolean running = true;//线程状态
private Future> serviceThreadStatus = null;
@PostConstructpublic voidinit() {
serviceThreadStatus= service.submit(new Thread(newRunnable() {
@Overridepublic voidrun() {while(running) {try{//开始一个任务
QueueTaskHandler task =tasks.take();try{
task.processData();
}catch(Exception e) {
log.error("任务处理发生错误", e);
}
}catch(InterruptedException e) {
log.error("服务停止,退出", e);
running= false;
}
}
}
},"save data thread"));
}public booleanaddData(QueueTaskHandler dataHandler) {if (!running) {
log.warn("service is stop");return false;
}//offer 队列已经满了,无法再加入的情况下
boolean success =tasks.offer(dataHandler);if (!success) {
log.warn("添加任务到队列失败");
}returnsuccess;
}public booleancheckServiceRun() {return running && !service.isShutdown() && !serviceThreadStatus.isDone();
}public voidactiveService() {
running= true;if(service.isShutdown()) {
service=Executors.newSingleThreadExecutor();
init();
log.info("线程池关闭,重新初始化线程池及任务");
}if(serviceThreadStatus.isDone()) {
init();
log.info("线程池任务结束,重新初始化任务");
}
}
@PreDestroypublic voiddestory() {
running= false;
service.shutdownNow();
}
}