• 需求: 由于在微服务架构中各服务之间都是通过接口调用来进行交互的,像很多的基础服务,类似字典信息其实并不需每次需要的时候再去请求接口.所以我的想法是每次启动项目的时候,容器初始化完成,就去调用一下基础服务的接口.通过一个本地map来缓存需要的数据.当我需要使用的时候直接从本地缓存中取.下面是具体的代码实现.
  • 在启动类中实现ApplicationListener 接口,重写onApplicationEvent(ApplicationReadyEvent applicationReadyEvent)方法.
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.ComponentScan; import java.util.Map; import static com.ykc.flowside.constants.Constants.DISCOUNT_TYPE;
import static com.ykc.flowside.constants.Constants.OPERATOR_INFO;
import static com.ykc.flowside.utils.FeignStaticUtils.getDictInfo;
import static com.ykc.flowside.utils.FeignStaticUtils.getOperatorInfo; /**
* @author lisongyu
* @ClassName com.ykc.flow.FlowSideApplication
* @description
* @create 2019年03月25日 16:31
*/
@SpringBootApplication(exclude = {KafkaAutoConfiguration.class})
@ComponentScan(basePackages = "com.ykc")
@Slf4j
@EnableFeignClients
public class FlowSideApplication implements ApplicationListener<ApplicationReadyEvent> { public static void main(String[] args) {
SpringApplication.run(FlowSideApplication.class, args); } @Override
public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
try {
Map<String, DictEntity> dictInfo = getDictInfo();
log.info("[项目启动时调用g1] 字典数据:{}条", dictInfo.size());
Map<Integer, OperatorInfo> operatorInfo = getOperatorInfo(null);
log.info("[项目启动时调用g1] 电站数据:{}条", operatorInfo.size());
dictInfo.keySet().forEach(k -> DISCOUNT_TYPE.put(k, dictInfo.get(k)));
operatorInfo.keySet().forEach(k -> OPERATOR_INFO.put(k, operatorInfo.get(k)));
} catch (Exception e) {
log.error("[项目启动时调用g1] 发生错误,", e);
}
} }
  • 调用工具类
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.ykc.config.common.entity.Header;
import com.ykc.config.common.entity.Message;
import com.ykc.config.common.entity.RequestData;
import com.ykc.flowside.entity.base.DictEntity;
import com.ykc.flowside.exception.FlowSideException;
import com.ykc.flowside.feign.IBaseServerFeign;
import com.ykc.flowside.form.flow.OrgForm;
import com.ykc.flowside.vo.GunInfo;
import com.ykc.flowside.vo.OperatorInfo;
import com.ykc.flowside.vo.OrgVO;
import com.ykc.service.RedisService;
import com.ykc.util.CodeHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import static com.ykc.flowside.constants.Constants.FLOW_SIDE; /**
* @author lisongyu
* @ClassName cn.lisongyu.utils.FeignStaticUtils
* @description
* @create 2019年04月08日 16:30
*/
@Component
@Slf4j
public class FeignStaticUtils { //存放运营商信息
public static ConcurrentHashMap<Integer, OperatorInfo> OPERATOR_INFO = new ConcurrentHashMap<>();
//存放字典信息
public static ConcurrentHashMap<String, DictEntity> DISCOUNT_TYPE = new ConcurrentHashMap<>(); private static IBaseServerFeign iBaseServerFeign; private static RedisService redisService; @Autowired
public FeignStaticUtils(IBaseServerFeign iBaseServerFeign, RedisService redisService) {
FeignStaticUtils.iBaseServerFeign = iBaseServerFeign;
FeignStaticUtils.redisService = redisService;
} /**
* 获取服务费折扣类型
*
* @return
*/
public static Map<String, DictEntity> getDictInfo() {
//调用G1接口
RequestData<Object> requestData = new RequestData<>();
requestData.setHeader(new Header());
Map<String, List<String>> param = new HashMap<>();
param.put("types", Collections.singletonList("service_discount_type"));
requestData.setBody(param);
Message dictionary = iBaseServerFeign.getDictionary(requestData);
List<DictEntity> discountTypes = JSONArray.parseArray(JSON.toJSONString(
(JSON.parseObject(
JSON.toJSONString(dictionary.getBody()), Map.class).get("service_discount_type"))),
DictEntity.class);
//将字典项转换成map
return discountTypes.stream().collect(Collectors.toMap(DictEntity::getId, a -> a, (k1, k2) -> k1));
} /**
* 获取运营商信息
*
* @return
*/
public static Map<Integer, OperatorInfo> getOperatorInfo(Integer operatorId) {
//调用G1接口 获取运营商信息
RequestData<Object> requestData = new RequestData<>();
requestData.setHeader(new Header());
Map<String, List<String>> param = new HashMap<>();
if (CodeHelper.isNull(operatorId))
param.put("idList", Collections.emptyList());
else
param.put("idList", Collections.singletonList(String.valueOf(operatorId)));
requestData.setBody(param);
Message message = iBaseServerFeign.selectOperatorNameById(requestData);
List<OperatorInfo> operatorInfos = JSONArray.parseArray(JSON.toJSONString(message.getBody()), OperatorInfo.class);
//将运营商信息转换成map
return operatorInfos.stream().collect(Collectors.toMap(OperatorInfo::getStationOperatorId, a -> a, (k1, k2) -> k1));
} /**
* 模糊查询运营商信息
*
* @return
*/
public static List<Integer> likeByOperatorName(String stationOperatorName) {
//调用G1接口 模糊查询运营商信息
try {
RequestData<Object> requestData = new RequestData<>();
requestData.setHeader(new Header());
Map<String, String> param = new HashMap<>();
param.put("stationOperatorName", stationOperatorName);
requestData.setBody(param);
Message message = iBaseServerFeign.likeByOperatorName(requestData);
List<OperatorInfo> operatorInfos = JSONArray.parseArray(JSON.toJSONString(message.getBody()), OperatorInfo.class);
return operatorInfos.stream().map(OperatorInfo::getStationOperatorId).collect(Collectors.toList());
} catch (Exception e) {
log.error("[调用G1接口 模糊查询运营商信息] 发生错误", e);
return Collections.singletonList(0);
}
} }
  • 由于在静态类中使用@Autowired注入会默认成null,所以要使用当前类去重新获取一下.

spring启动容器加载成功后执行调用方法的更多相关文章

  1. spring boot容器加载完后执行特定操作

    有时候我们需要在spring boot容器启动并加载完后,开一些线程或者一些程序来干某些事情.这时候我们需要配置ContextRefreshedEvent事件来实现我们要做的事情 1.Applicat ...

  2. spring 容器加载完成后执行某个方法

    理论 刚好再开发过程中遇到了要在项目启动后自动开启某个服务,由于使用了spring,我在使用了spring的listener,它有onApplicationEvent()方法,在Spring容器将所有 ...

  3. 基于DOMContentLoaded实现文档加载完成后执行的方法

    我们有时可能需要一些在页面加载完成之后执行的方法,其实js原生就提供了onload方法,所以我们最简单的办法就是直接给onload赋值一个函数,在页面加载完成之后就会自动执行 widnow.onloa ...

  4. springboot框架在容器加载完成之后执行某个方法

    问题描述: 想在websocket实现的Handler中执行一些初始化操作,但是初始化操作使用到了@Autowired自动注入的变量,而且是保护类型.第一个想法是放到Handler构造函数中执行,但是 ...

  5. asp.net中UpdatePanel数据加载成功后回调

    //添加UpdatePanel加载成功后执行的js方法 Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(onPageLoade ...

  6. PageSlider中CSS3动画在除首屏之外先加载页面后执行动画的问题

    PageSlider中CSS3动画在除首屏之外先加载页面后执行动画的问题,PageSlider中加入CSS3动画的话,默认只有首屏是从无到有执行动画,其他屏都是显示下页面再执行动画 这就造成其他屏的动 ...

  7. js页面加载完后执行(document.onreadystatechange 和 document.readyState)

    js页面加载完后执行javascript(document.onreadystatechange 和 document.readyState) document.onreadystatechange ...

  8. js中页面加载完成后执行的几种方法及执行顺序

    在js和jquery使用中,经常使用到页面加载完成后执行某一方法.通过整理,大概是五种方式(其中有的只是书写方式不一样). 1:使用jQuery的$(function){}; 2:使用jquery的$ ...

  9. js中页面加载完成后执行的几种方式及执行顺序

    1:使用jQuery的$(function){}; 2:使用jquery的$(document).ready(function(){});前两者本质上没有区别,第1种是第2种的简写方式.两个是docu ...

随机推荐

  1. Concat

    .net 对List使用Concat newlist=list.Concat(list2).ToList() JS的Concat则不用ToList(),一样要用个值去接 Concat返回是一个新数组, ...

  2. 硬杠后端(后端坑系列)——Django前期工作

    Django是一个开放源代码的Web应用框架,由Python写成,采用了MVC的框架模式. MVC MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个部件 ...

  3. 在VS 2017 下创建 Xamarin NuGet Package

    最近在做一个Xamarin for android的项目,有个需求是一次可以从相册中选择多张图片,但是 android API<19 的版本还不支持一次选择多张图片,在网上找了一下,发现原生的组 ...

  4. arcgis api 3.x for js 入门开发系列十五台风轨迹

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  5. 高通方案的Android设备几种开机模式的进入与退出

    高通方案的Android设备主要有以下几种开机模式,Android.EDL.Fastboot.Recovery和FFBM,其进入及退出的方式如下表. 开机模式 屏幕显示 冷启动 热启动 按键退出 命令 ...

  6. 新浪短连接API免登陆免认证实例

    string source = "source=2849184197"; // APP Key,这个可以根据自己需要去网上搜索 string url_long = $"u ...

  7. HTTP各个status code是什么意思【已解决】

    在介绍状态码之前,要简单讲一下为什么要有状态码这个东西.计算机之间的通信以协议为共同基础,客户端和服务端都按照协议的约定进行通信.HTTP的状态码就在HTTP的协议内,规定了很多的状态.客户端请求服务 ...

  8. Testlink1.9.17使用方法( 第四章 测试需求管理 )

    第四章 测试需求管理 QQ交流群:585499566 需求规格说明书是我们开展测试的依据.首先,我们可以对项目(产品)的需求规格说明书进行分解和整理,将其拆分为多个需求,一个项目可以包含多个需求,一个 ...

  9. Spark RPC框架源码分析(二)RPC运行时序

    前情提要: Spark RPC框架源码分析(一)简述 一. Spark RPC概述 上一篇我们已经说明了Spark RPC框架的一个简单例子,Spark RPC相关的两个编程模型,Actor模型和Re ...

  10. (五)图数据库数neo4j据备份与恢复

    1.备份方式 neo4j目前有三种备份方式: (1)java在线备份,通过java程序可在neo4j启动状态下备份数据,也可远程备份(社区版本目前不支持) (2)neo4j-admin工具,可在neo ...