EqpOutDelayQueueService.java 2.47 KB
package com.zteits.park.quene;

import com.alibaba.fastjson.JSONObject;
import com.clouds.common.cache.sys.SysCodeValueCacheUtil;
import com.clouds.common.constants.CodeValKindEnum;
import com.zteits.clouds.api.apibase.bean.BizResult;
import com.zteits.clouds.api.apibase.constants.ErrorType;
import com.zteits.clouds.api.apibase.exception.BizException;
import com.zteits.clouds.api.dto.park.dto.BerthsDTO;
import org.redisson.api.RBlockingQueue;
import org.redisson.api.RDelayedQueue;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * 地磁上报出场队列消息服务
 * Copyright: Copyright (c) 2018  zteits
 * 
 * @Description: 
 * @version: v1.0.0
 * @author: xiejianpeng
 * @date: 2019/8/14 16:44  
 * Modification History:
 * Date             Author          Version            Description
 *---------------------------------------------------------*
 * 2019/8/14     xiejianpeng         v1.0.0               创建
 */
@Component
public class EqpOutDelayQueueService {

	Logger logger = LoggerFactory.getLogger(EqpOutDelayQueueService.class);
    @Autowired
    private RedissonClient redissonClient;

    private RBlockingQueue<BerthsDTO> queue;

    /**
     * 新增队列通知
     *
     * @param
     * @return
     */
    public BizResult<Boolean> addNotice(BerthsDTO berthsDTO) {
    	try {
    		Long limitMinute = Long.valueOf(SysCodeValueCacheUtil.queryCodeValue(CodeValKindEnum.APP_OPT_ORDER_OUT_TIME_LIMIT_MINUTE));
			if(limitMinute == null){
				throw new BizException(ErrorType.BIZ_ERROR,"地磁上报出场离场时间的间隔时间(分钟)未取到,请刷新缓存!");
			}
    		RDelayedQueue<BerthsDTO> delayedQueue = redissonClient.getDelayedQueue(getQueue());
			logger.info("订单延迟通知消息队列,消息长度为{}",delayedQueue.size());
    		delayedQueue.offer(berthsDTO, limitMinute,TimeUnit.MINUTES);
		} catch (Exception e) {
			logger.error("addNotice:{}",JSONObject.toJSONString(e));
		}
        return new BizResult<>(true);
    }

    public BerthsDTO getNotice() {
        BerthsDTO order = getQueue().poll();
        return order;

    }

    private RBlockingQueue<BerthsDTO> getQueue() {
        if (null == queue) {
            queue = redissonClient.getBlockingQueue(QueneNameEnum.EQP_OUT_QUEUE_MSG_NOTICE.getName());
        }
        return queue;
    }

}