package com.fdkankan.manage.mq.consumer; import com.alibaba.fastjson.JSONObject; import com.fdkankan.fyun.face.FYunFileServiceInterface; import com.fdkankan.manage.common.RedisKeyUtil; import com.fdkankan.manage.common.ResultCode; import com.fdkankan.manage.exception.BusinessException; import com.fdkankan.manage.mq.param.SceneRestStoreVo; import com.fdkankan.manage.service.ISceneColdStorageLogService; import com.fdkankan.manage.service.ISceneColdStorageService; import com.fdkankan.manage.service.ISceneProService; import com.fdkankan.manage.thread.ThreadService; import com.fdkankan.redis.util.RedisUtil; import com.rabbitmq.client.Channel; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.Queue; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.Date; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; /** * 场景解冻 mq */ @Slf4j @Component public class SceneRestStoreConsumer { @Autowired FYunFileServiceInterface fYunFileServiceInterface; @Autowired RedisUtil redisUtil; @Autowired ISceneColdStorageService sceneColdStorageService; @Autowired ISceneColdStorageLogService sceneColdStorageLogService; @Autowired ISceneProService sceneProService; @RabbitListener( queuesToDeclare = @Queue("${queue.scene.rest-store:scene-rest-store}"), concurrency = "1" ) public void consumerQueue(Channel channel, Message message) throws IOException { try { String messageId = message.getMessageProperties().getMessageId(); String msg = new String(message.getBody(), StandardCharsets.UTF_8); log.info("scene-restStore-mq--messageId:{},msg:{}",messageId,msg); SceneRestStoreVo sceneRestStoreVo = JSONObject.parseObject(msg, SceneRestStoreVo.class); String num = sceneRestStoreVo.getNum(); String cloudBucket= sceneRestStoreVo.getCloudBucket(); String bucket= sceneRestStoreVo.getBucket(); String folderName= sceneRestStoreVo.getFolderName(); String redisKey = String.format(RedisKeyUtil.restStoreKey, num); if(redisUtil.hasKey(redisKey)){ return; } redisUtil.set(redisKey,folderName); try { fYunFileServiceInterface.restoreFolder(cloudBucket,folderName,1); }catch (Exception e){ log.info("scene-restStore-mq-error:",e); } Long startTime = new Date().getTime(); Integer process = fYunFileServiceInterface.getRestoreFolderProcess(cloudBucket, folderName); log.info("scene-restStore-mq-cloudBucket:{},bucket:{},folderName:{},process:{}",cloudBucket,bucket,folderName,process); while (process != 100 ){ Long time = new Date().getTime(); if(time - startTime >1000 * 60 * 10){ startTime = time; process = fYunFileServiceInterface.getRestoreFolderProcess(cloudBucket, folderName); log.info("scene-restStore-mq-cloudBucket:{},bucket:{},folderName:{},process:{}",cloudBucket,bucket,folderName,process); } } fYunFileServiceInterface.copyFileBetweenBucket(cloudBucket,folderName,bucket,folderName); log.info("Tscene-restStore-mq-copy-bucket"); sceneColdStorageService.updateStatus(num,2); sceneColdStorageLogService.saveLog(num,folderName); sceneProService.restStoreSuccess(num); redisUtil.del(redisKey); }catch (Exception e){ log.info("scene-restStore----消费失败",e); }finally { channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); } } }