BasicData.java 2.93 KB
package com.bsth.common;

import com.bsth.Application;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 一些基础数据缓存
 * Created by panzhao on 2017/8/24.
 */
@Component
@Order(1)
public class BasicData implements CommandLineRunner {

    /**
     * 线路编码和在执行的班次日期
     * code ——> yyyy-MM-dd
     */
    public static Map<String, String> lineDateMap;

    public static Map<String, String> lineStartTimeMap;

    @Autowired
    BasicDataLoader basicDataLoader;

    @Override
    public void run(String... strings) throws Exception {
        basicDataLoader.run();
        Application.mainServices.scheduleWithFixedDelay(basicDataLoader, 60 * 10, 60 * 10, TimeUnit.SECONDS);
    }

    private static DateTimeFormatter fmtHHmm = DateTimeFormat.forPattern("HH:mm");
    private static DateTimeFormatter fmtyyyyMMdd = DateTimeFormat.forPattern("yyyyMMdd");
    private static DateTimeFormatter fmtyyyyMMddHHmm = DateTimeFormat.forPattern("yyyy-MM-ddHH:mm");
    private final static long DAY_TIME = 1000 * 60 * 60 * 24L;

    @Component
    public static class BasicDataLoader extends Thread {

        @Autowired
        JdbcTemplate jdbcTemplate;

        @Override
        public void run() {
            loadLineDateMap();
        }

        private void loadLineDateMap(){
            Map<String, String> lineDateMapCopy = new HashMap<>();
            Map<String, String> lineStartTimeMapCopy = new HashMap<>();

            String sql = "select START_OPT,t2.LINE_CODE from bsth_c_line_config t1 INNER JOIN bsth_c_line t2 on t1.line=t2.id where t2.line_code is not null";
            //String cts = fmtHHmm.print(System.currentTimeMillis());

            List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
            String lineCode, startTime;
            for(Map<String, Object> map : list){
                lineCode = map.get("LINE_CODE").toString();
                startTime = map.get("START_OPT").toString();
                lineDateMapCopy.put(lineCode, calcScheduleDate(startTime));
                lineStartTimeMapCopy.put(lineCode, startTime);
            }

            lineDateMap = lineDateMapCopy;
            lineStartTimeMap = lineStartTimeMapCopy;
        }

        private String calcScheduleDate(String startDate){
            long t = System.currentTimeMillis();

            if(fmtHHmm.print(t).compareTo(startDate) < 0)
                t += DAY_TIME;

            return fmtyyyyMMdd.print(t);
        }
    }
}