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;
        }
    }

}
优化下java代码加一个请求大的时候进行延迟public class UploadQueueHelper Resource QCTranslationService qcTranslationService; private static final Logger log = LoggerFactorygetLoggerUploadQueueHelperclass; pr

原文地址: https://www.cveoy.top/t/topic/ckpk 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录