优化下java代码加一个请求大的时候进行延迟public class UploadQueueHelper Resource QCTranslationService qcTranslationService; private static final Logger log = LoggerFactorygetLoggerUploadQueueHelperclass; pr
public class UploadQueueHelper {
@Resource
QCTranslationService qcTranslationService;
private static final Logger log = LoggerFactory.getLogger(UploadQueueHelper.class);
private static boolean LOCK = false;
private static final int MAX_QUEUE_SIZE = 6000;
private static final int DELAY_TIME_MS = 5000; // 延迟时间,单位为毫秒
private static final LinkedTransferQueue<Long> transferQueue = new LinkedTransferQueue<>();
private static final ExecutorService threadPool = Executors.newSingleThreadExecutor();
// .Constructor >> @Autowired >> @PostConstruct
private static UploadQueueHelper queueHelper;
@PostConstruct
private void init() {
queueHelper = this;
}
private static void insertCalllog(Long id) throws Exception {
queueHelper.qcTranslationService.insterCalllog(id);
}
/**
* @param id 队列处理对象(包含request,response,data)
*/
public static void requestQueue(Long id) {
//检测当前的队列大小
if (transferQueue.size() < MAX_QUEUE_SIZE) {
//可以正常进入队列
transferQueue.put(id);
if (!LOCK) {
LOCK = true;
//example:run
threadPool.execute(new Customer());
}
} else {
//队列不正常,或队列大小已达上限,做出相应处理
log.error("UploadQueueHelper:队列异常或者大小已达到上限!");
}
}
private static class Customer implements Runnable {
@Override
public void run() {
try {
while (LOCK) {
Long id = transferQueue.poll();
if (id != null) {
insertCalllog(id);
}
if (transferQueue.size() >= MAX_QUEUE_SIZE && LOCK) {
// 如果队列大小已经达到上限,并且还在处理队列中,则进行延迟
Thread.sleep(DELAY_TIME_MS);
}
}
System.err.println(Thread.currentThread().getName() + ",消费者程序执行完毕");
} catch (InterruptedException e) {
log.error("消费者程序退出-UploadQueueHelper:" + e.getLocalizedMessage());
Thread.currentThread().interrupt();
} catch (Exception e) {
e.printStackTrace();
log.error("消费者程序退出-UploadQueueHelper:" + e.getLocalizedMessage());
} finally {
LOCK = false;
}
}
}
原文地址: https://www.cveoy.top/t/topic/ckpk 著作权归作者所有。请勿转载和采集!