之前写了一边草稿结果居然忘了保存了或者说不知道去哪里了,今天在写一次也算是巩固一下啊
时隔一周了已经有点忘记了之前写了啥了
首先说一下思路:
做一个功能需要一直存表,考虑可能数据量大就放到redis存储一个队列,然后再同时起一个方法
取出redis存储的数据一个一个去存表,因为要一直取所以还要用到while循环,同时开启一个线程
来共同执行,所以今天学到了一个注解@PostConstruct,在此记录一下。
说一下实现吧:
首先在方法上加上@PostConstruct注解就可以在项目启动的时候同时调用这个项目了,这个注解
只在项目启动的时候启动一次,启动了就要开启个线程共同运行new Thread(),调用run方法启
动,其中调取的时候不用那么频繁,给Thread.sleep()睡眠一下再继续调用,我这里是设置了调取
到数据和调取不到设置的时间是不同的,以便没数据时让线程等一下。之后因为需要一直调,所以
加了while死循环,这个用的多了,就不说了。再说就是redis的rpush和lpop了,我是这样用的存储
到队列,反正用成一对就可以了。取到数据save如表就可以了。
实践:
@PostConstruct
public void init() {
log.info("=== init method start!===");
new Thread(new Runnable(){
@Override
public void run(){
try {
// 暂停2分钟,防止服务节点未启动
Thread.sleep(1000*20L);
} catch (InterruptedException e) {
log.error(e.getMessage(), e);
}
log.info("=== init method thread run!===");
Request<RedisRpcServiceLpopReq> redisReq = new Request<>();
redisReq.setData(RedisRpcServiceLpopReq.builder().key("AAA").build());
while (true){
log.info("=== init method thread loop execute start!===");
try {
// 暂停一段时间
Thread.sleep(500L);
log.info("=== init method thread redis input{}!===",JSONObject.toJSON(redisReq));
Response<RedisRpcServiceLpopResp> redisResp = redisService.lpop(redisReq);
if(!redisResp.success()){
continue;
}
RedisRpcServiceLpopResp popResp = redisResp.getData();
if(popResp == null){
continue;
}
log.info("=== init method thread redis getParm{}!===",JSONObject.toJSON(redisResp.getData()));
String val = popResp.getValue();
if (StringUtils.isBlank(val)){
continue;
}
Request<HomePageConfigRpcServiceMenuLogsReq> reqRequest = new Request<>();
HomePageConfigRpcServiceMenuLogsReq req = JSONObject.parseObject(val, HomePageConfigRpcServiceMenuLogsReq.class);
reqRequest.setData(req);
hotMenuService.saveMenuLogs(reqRequest);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
}).start();
}
总结一下:用到了redis 、thread、while 、 @PostConstruct注解