主程序入口
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, 应该写入数据库从接口读取或者让前端订阅