package com.estate.expert.common; import com.alibaba.fastjson.JSONObject; import com.estate.expert.common.enums.AppEnv; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.base.Supplier; import lombok.AccessLevel; import lombok.Builder; import lombok.Data; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.info.GitProperties; import org.springframework.boot.info.InfoProperties; import org.springframework.context.ApplicationContext; import org.springframework.core.env.Environment; import java.net.InetAddress; import java.net.UnknownHostException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Map; import java.util.Properties; import java.util.Spliterators; import java.util.UUID; import java.util.stream.Collectors; import java.util.stream.StreamSupport; /** * @author code */ @Data @Slf4j public class AppRuntime { private static final DateTimeFormatter DAY_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); private static final DateTimeFormatter DAY_HOUR_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHH"); String appId; String appName; AppEnv env; /** * 服务启动时间,单位毫秒 */ Long startTime; GitProperties gitProperties; String hostIP; JSONObject ext; /** * 唯一标示当前的app实例. 实例重启后会重新 */ @Setter(value = AccessLevel.NONE) String instanceId; public String getInstanceId() { if (instanceId == null) { instanceId = UUID.randomUUID().toString(); } return instanceId; } @Builder public AppRuntime(String appId, String appName, AppEnv env, ApplicationContext applicationContext) { Preconditions.checkArgument(env != null || applicationContext != null, "env和applicationContext不能都为空"); this.appId = appId; this.appName = appName; this.env = env; // 默认构建一个空的gitProperties this.gitProperties = new GitProperties(new Properties()); this.startTime = System.currentTimeMillis(); this.hostIP = "unknown"; this.ext = new JSONObject(); try { this.hostIP = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { log.error("failed to get host ip", e); } // 获取applicationContext中保存的信息 if (applicationContext != null) { Environment environment = applicationContext.getEnvironment(); this.env = AppEnv.valueOf(environment.getActiveProfiles()[0]); if (applicationContext.containsBean("gitProperties")) { this.gitProperties = applicationContext.getBean("gitProperties", GitProperties.class); } } } private String doBuildPrefixKey(Supplier prefixSupplier, Object... keys) { StringBuilder sb = new StringBuilder(appId).append(":"); if (env != AppEnv.product) { sb.append(env.name()).append(":"); } if (prefixSupplier != null) { sb.append(prefixSupplier.get()).append(":"); } sb.append(Joiner.on(":").skipNulls().join(keys)); return sb.toString(); } /** * @param keys * @return appid:env:key1:key2 */ public String buildPrefixKey(Object... keys) { return doBuildPrefixKey(null, keys); } /** * 返回key: appid:env:20190101:key1:key2 * * @param keys * @return appid:env:20190101:key1:key2 */ public String buildPrefixDayKey(Object... keys) { return doBuildPrefixKey(() -> LocalDateTime.now().format(DAY_FORMATTER), keys); } /** * 返回key: appid:env:2019010105:key1:key2 * * @param keys * @return key: appid:env:2019010105:key1:key2 */ public String buildPrefixDayHourKey(Object... keys) { return doBuildPrefixKey(() -> LocalDateTime.now().format(DAY_HOUR_FORMATTER), keys); } public JSONObject toJson() { JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(this)); // 获取gitProperties中详细的信息,因直接对gitProperties序列化得到的信息不完整,所以需要单独处理 Map gitPropsMap = StreamSupport.stream( gitProperties != null ? gitProperties.spliterator() : Spliterators.emptySpliterator(), false) .collect(Collectors.toMap(InfoProperties.Entry::getKey, InfoProperties.Entry::getValue)); jsonObject.put("gitProperties", JSONObject.parseObject(JSONObject.toJSONString(gitPropsMap))); return jsonObject; } }