DealGeoInOutParkDataSchedule.java 5.17 KB
package com.zteits.park.configuration.schedule;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

import com.clouds.common.utils.ExceptionUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.clouds.common.cache.sys.SysCodeValueCacheUtil;
import com.clouds.common.constants.CodeValKindEnum;
import com.clouds.common.constants.ParkConstant;
import com.clouds.common.utils.IPUtil;
import com.zteits.clouds.api.apibase.constants.ErrorType;
import com.zteits.clouds.api.apibase.constants.ParkBusiType;
import com.zteits.clouds.api.apibase.exception.BizException;
import com.zteits.clouds.api.dto.rocketmq.datacollection.georeport.GeoInOutReportMsgVO;
import com.zteits.park.configuration.schedule.param.DistributedTaskPropVO;
import com.zteits.park.domain.TpPInterfaceLogDO;
import com.zteits.park.domain.TpPInterfaceLogWithBLOBs;
import com.zteits.park.mapper.TpPInterfaceLogMapper;
import com.zteits.park.mapper.smapper.TpPInterfaceLogSMapper;
import com.zteits.park.service.eqpinoutrecord.oper.GeoInOutParkReportInnerService;

/**
 * 处理地磁进出场上报数据
 * .<br/>
 *
 * Copyright: Copyright (c) 2017  zteits
 *
 * @ClassName: DealGeoInOutParkDataSchedule
 * @Description:
 * @version: v1.0.0
 * @author: zhaowg
 * @date: 2018年5月4日 下午3:11:36
 * Modification History:
 * Date             Author          Version            Description
 *---------------------------------------------------------*
 * 2018年5月4日      zhaowg           v1.0.0               创建
 */

@Component
public class DealGeoInOutParkDataSchedule{
	private static final Logger logger = LoggerFactory.getLogger(DealGeoInOutParkDataSchedule.class);
	@Autowired
	private GeoInOutParkReportInnerService geoInOutParkReportInnerService;
	@Autowired
	private TpPInterfaceLogSMapper interfaceLogSMapper;
	@Autowired
	private TpPInterfaceLogMapper interfaceLogMapper;

	/**
	 * 间隔3秒执行一次
	 *
	 * 2018年5月4日 zhaowg
	 */
	@Scheduled(fixedDelay=1000)
	public void dealGeoInOutData(){
		//获取分布式任务配置信息
		String distributedTaskProp = SysCodeValueCacheUtil.queryCodeValue(CodeValKindEnum.DISTRIBUTED_TASK_PROP);
		if(StringUtils.isBlank(distributedTaskProp)){
			logger.debug("未配置分布式任务相关信息,不处理");
			return;
		}
		//获取当前服务器IP
		String ip = IPUtil.getLocalHost();
		List<DistributedTaskPropVO> taskVOs = JSON.parseArray(distributedTaskProp, DistributedTaskPropVO.class);
		Map<String, Integer> map = taskVOs.stream().collect(Collectors.toMap(DistributedTaskPropVO::getIp, DistributedTaskPropVO::getDelivery));
		if(!map.containsKey(ip)){
			logger.debug("分布式任务配置得服务器中不包含该服务器:"+ip+",故该服务器不处理任何数据");
			return;
		}
		Integer modelNum = map.get(ip);
		if(modelNum==null){
			logger.debug("分布式任务,该服务器:"+ip+"配置的取模参数为null,不处理任务数据");
			return;
		}
		int allNum = map.size();
		logger.debug("分布式任务,服务器一共:"+allNum+"台,当前服务器ip:"+ip+",处理的取模数据为:"+modelNum);
		this.execute(allNum,modelNum);
	}
	private void execute(int allNum, Integer modelNum) {
		//查询需要该服务器处理的数据
		TpPInterfaceLogDO interfaceLogDO = new TpPInterfaceLogDO();
		interfaceLogDO.setAllNum(allNum);
		interfaceLogDO.setBusiType(ParkBusiType.UPDATE_BERTH_STATUS_BY_EQP.getValue());
		interfaceLogDO.setDealStatus(ParkConstant.DealState.WAIT_DEAL);
		interfaceLogDO.setModelNum(modelNum);
		List<TpPInterfaceLogWithBLOBs> logWithBLOBs = interfaceLogSMapper.selectByModel(interfaceLogDO );
		if(CollectionUtils.isEmpty(logWithBLOBs)){
			logger.debug("未查询到地磁上报数据");
			return;
		}
		for (TpPInterfaceLogWithBLOBs tpPInterfaceLogWithBLOBs : logWithBLOBs) {
			try{
				//判断该条记录和当前时间相差是否小于30分钟,超过30分钟不处理
				if(new Date().getTime()-tpPInterfaceLogWithBLOBs.getCreateTime().getTime()>30*60*1000){
					throw new BizException(ErrorType.BIZ_ERROR,"超过30分钟的消息,不处理",false);
				}
				GeoInOutReportMsgVO msgVO = JSON.parseObject(tpPInterfaceLogWithBLOBs.getRequestBody(), GeoInOutReportMsgVO.class);
				geoInOutParkReportInnerService.dealGeoInOutParkReportData(msgVO);
				//删除该记录
				interfaceLogMapper.deleteByPrimaryKey(tpPInterfaceLogWithBLOBs.getId());
			}catch(Exception e){
				logger.error("处理地磁失败,原始信息为:"+tpPInterfaceLogWithBLOBs.getRequestBody(),e);
				TpPInterfaceLogWithBLOBs upInterface = new TpPInterfaceLogWithBLOBs();
				upInterface.setId(tpPInterfaceLogWithBLOBs.getId());
				upInterface.setDealStatus(ParkConstant.DealState.FAIL);
				upInterface.setErrorMsg(ExceptionUtil.getTrace(e));
				upInterface.setModifyTime(new Date());
				interfaceLogMapper.updateByPrimaryKeySelective(upInterface);
			}
		}
	}

}