package com.moral.task; import com.moral.strategy.RepairDataContext; import com.moral.strategy.RepairDataStrategy; import com.moral.strategy.RepairStrategyFactory; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.annotation.XxlJob; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.ObjectUtils; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.text.ParseException; import java.util.*; @Component public class RepairDataTask { @Resource RedisTemplate redisTemplate; @Resource RepairStrategyFactory factory; private Map sortMap = new HashMap<>(); @PostConstruct public void init(){ this.sortMap.put("repairHourlyData",3); this.sortMap.put("repairFiveMinutelyData",2); this.sortMap.put("repairMinutelyData",1); } @XxlJob("repairData") public ReturnT repairData(String param) throws ParseException { //从缓存中读取插入失败的数据 List records = redisTemplate.opsForList().range("unrepair_data", 0, -1); if(ObjectUtils.isEmpty(records)) return new ReturnT(200,"无数据需要修补"); //对错误信息进行排序 sorRecords(records); redisTemplate.delete("unrepair_data"); MultiValueMap results = new LinkedMultiValueMap<>(); RepairDataContext context = new RepairDataContext(); for (String record : records) { RepairDataStrategy instance = factory.getInstance(record); context.setRepairDataStrategy(instance); context.executeStrategy(record.split("_")[1], results); } return new ReturnT(200,results.toString()); } public void sorRecords(List records){ Collections.sort(records, new Comparator() { @Override public int compare(String o1, String o2) { Integer integer = sortMap.get(o1.split("_")[0]); Integer integer1 = sortMap.get(o2.split("_")[0]); return integer>integer1?1:-1; } }); } }