java:api中开线程缓存接口行情盘口数据

主程序入口

package com.ycyj.gongshi.api;

import com.ycyj.common.spring.YCYJSpringApplication;
import com.ycyj.gongshi.api.cachefile.CachePanKouDataRun;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * 公式发布api
 */

@Slf4j
@SpringBootApplication
@EnableScheduling
public class GongShiWebApiMain {

    // java -jar hq-webapi-1.0.jar --spring.profiles.active=prod --server.port=9001
    public static void main(String[] args) {
        try {
            // 公式api
            //YCYJSpringApplication.run(GongShiWebApiMain.class, args);

            // 公式缓存盘口信息
             new CachePanKouDataRun().start();
        } catch (Exception ex) {
            //System.out.println("ex = " + ex);
            log.warn(ex.toString());
        }
    }

}

  

2. 主要程序

package com.ycyj.gongshi.api.cachefile;
import com.alibaba.fastjson.JSONObject;
import com.ejlchina.okhttps.HTTP;
import com.ejlchina.okhttps.fastjson.FastjsonMsgConvertor;
import com.ycyj.common.config.YamlConfig;
import com.ycyj.common.tool.TradeDayManage;
import lombok.extern.slf4j.Slf4j;

import java.text.SimpleDateFormat;
import java.util.*;


/**
 * 盘口数据缓存为公式接口所使用
 */
@Slf4j
public class CachePanKouDataRun extends Thread{

    public static final String tag = "公式缓存盘口Run";
    public static HashMap<String, Object> codeHqDict = new HashMap<>();
    public static List<String> hqFields =  Arrays.asList("Obj","ZhongWenJianCheng","ZhangFu","ZuiXinJia",
            "FenZhongZhangFu5","LiuTongShiZhi","ChengJiaoE");

    public static void initCacheHq(){

        // 将该时间数据设置为0
        for(Map.Entry<String, Object> entry : codeHqDict.entrySet()) {

            // 强制转换成FenLeiCache 类
            var valueObject = (FenLeiCache) entry.getValue();
            var key = entry.getKey();

            valueObject.ZhangFu = 0.0;
            valueObject.ZuiXinJia = 0.0;
            valueObject.ZhangSu = 0.0;
            valueObject.LiuTongShiZhi = 0.0;
            valueObject.ChengJiaoE = 0.0;
            // System.out.println("Key:"+key+" value:"+valueObject);
            log.info(String.format("%s 900-915之间初始化", tag));

        }
    }

    public static void requestCacheHq() throws InterruptedException {

        var hoststr = YamlConfig.get("api_host.GW_PC_Host.k8s");
        var hqStrFields = String.join(",", hqFields);
        var path = "/HQApi/50000/GetFenleiCodeNameList2ForServer?fenlei=30&start=0&count=6000&orderby=ZhangFu&desc=True&ts=debug&field=" + hqStrFields;
        var http = HTTP.builder()
                .baseUrl(hoststr)
                .addMsgConvertor(new FastjsonMsgConvertor()).build();
        var httpResult = http.sync(path).get();
        var strBody = httpResult.getBody().toString();
        //System.out.println(strBody);

        // 处理过程
        var respData = JSONObject.parseObject(strBody, ReqFenLeiData.class);
        if (respData.State == 1) {
            var flDict = respData.Data;
            var count = flDict.Count;
            var data = flDict.Data;
            for (int i = 0; i < data.size(); i++) {
                var item = data.get(i);

                // 涨速处理
                item.ZhangSu = item.FenZhongZhangFu5;
                // 赋值然后进入字典
                var newItem = new FenLeiCache(item);
                codeHqDict.put(item.Obj, newItem);
            }
        }

        // 结果展示
        //codeHqDict.forEach((code, codeDict)->{
        //    System.out.println(code + "/" + codeDict);
        //});


        // 取一次休息3秒
        log.info(String.format("%s 盘中缓存 %d", tag, codeHqDict.size()));
        Thread.sleep(1000 * 3);

    }

    @Override
    public void run() {

        // 刚启动时候执行初始化
        try {
            requestCacheHq();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 正常时间执行相关操作
        while(true){
            var _hm = Integer.valueOf(new SimpleDateFormat("HHmm").format(new Date()));
            if (TradeDayManage.isTradeDay() && _hm >= 900 && _hm < 915) {
                initCacheHq();
            }else if(TradeDayManage.isTradeDay() && _hm >= 915 && _hm < 1132){
                try {
                    requestCacheHq();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else if(TradeDayManage.isTradeDay() && _hm >= 1300 && _hm < 1510){
                try {
                    requestCacheHq();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else{
                try {
                    Thread.sleep(1000 * 30);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }


//    public static void main(String [] args) {
//        new CachePanKouDataRun().start();
//    }

}

  

3. 其他依赖

package com.ycyj.gongshi.api.cachefile;

import lombok.ToString;

/**
 * 缓存盘口数据字典的value值
 */

@ToString
public class FenLeiCache extends FenLeiEntity {


    public String Code = "";
    public String Name = "";
    public double ZhangFu = 0.0;
    public double ZuiXinJia = 0.0;
    public double ZhangSu = 0.0;
    public double LiuTongShiZhi = 0.0;
    public double ChengJiaoE = 0.0;

    public FenLeiCache(FenLeiEntity obj) {
        super();
        this.Code = obj.Obj;
        this.Name = obj.ZhongWenJianCheng;
        this.ZhangFu = obj.FenZhongZhangFu5;
        this.ZuiXinJia = obj.ZuiXinJia;
        this.ZhangSu = obj.ZhangSu;
        this.LiuTongShiZhi = obj.LiuTongShiZhi;
        this.ChengJiaoE = obj.ChengJiaoE;
    }

}

  

package com.ycyj.gongshi.api.cachefile;

import lombok.ToString;

/**
 * 缓存盘口数据字典的value值
 */

@ToString
public class FenLeiCache extends FenLeiEntity {


    public String Code = "";
    public String Name = "";
    public double ZhangFu = 0.0;
    public double ZuiXinJia = 0.0;
    public double ZhangSu = 0.0;
    public double LiuTongShiZhi = 0.0;
    public double ChengJiaoE = 0.0;

    public FenLeiCache(FenLeiEntity obj) {
        super();
        this.Code = obj.Obj;
        this.Name = obj.ZhongWenJianCheng;
        this.ZhangFu = obj.FenZhongZhangFu5;
        this.ZuiXinJia = obj.ZuiXinJia;
        this.ZhangSu = obj.ZhangSu;
        this.LiuTongShiZhi = obj.LiuTongShiZhi;
        this.ChengJiaoE = obj.ChengJiaoE;
    }

}

  

5. 不要在API中开线程缓存程序 影响API, 应该写入数据库从接口读取或者让前端订阅

 

posted @ 2022-01-24 14:53  Adamanter  阅读(79)  评论(0)    收藏  举报