package com.ctrip.framework.apollo.portal.spi.ctrip; import com.google.gson.Gson; import com.ctrip.framework.apollo.common.entity.App; import com.ctrip.framework.apollo.core.enums.Env; import com.ctrip.framework.apollo.portal.component.config.PortalConfig; import com.ctrip.framework.apollo.portal.entity.bo.ReleaseHistoryBO; import com.ctrip.framework.apollo.portal.service.AppService; import com.ctrip.framework.apollo.portal.service.ReleaseService; import com.ctrip.framework.apollo.portal.spi.MQService; import com.ctrip.framework.apollo.tracer.Tracer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.client.RestTemplate; import java.util.Arrays; import javax.annotation.PostConstruct; public class CtripMQService implements MQService { private static final org.apache.commons.lang.time.FastDateFormat TIMESTAMP_FORMAT = org.apache.commons.lang.time.FastDateFormat.getInstance("yyyy-MM-dd hh:mm:ss"); private static final String CONFIG_PUBLISH_NOTIFY_TO_NOC_TOPIC = "ops.noc.record.created"; private Gson gson = new Gson(); @Autowired private AppService appService; @Autowired private ReleaseService releaseService; @Autowired private PortalConfig portalConfig; private RestTemplate restTemplate; @PostConstruct public void init() { restTemplate = new RestTemplate(); SimpleClientHttpRequestFactory rf = (SimpleClientHttpRequestFactory) restTemplate.getRequestFactory(); rf.setReadTimeout(portalConfig.readTimeout()); rf.setConnectTimeout(portalConfig.connectTimeout()); MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setSupportedMediaTypes( Arrays.asList(MediaType.APPLICATION_JSON, MediaType.APPLICATION_OCTET_STREAM)); restTemplate.setMessageConverters(Arrays.asList(converter, new FormHttpMessageConverter())); } @Override public void sendPublishMsg(Env env, ReleaseHistoryBO releaseHistory) { if (releaseHistory == null) { return; } PublishMsg msg = buildPublishMsg(env, releaseHistory); sendMsg(portalConfig.hermesServerAddress(), CONFIG_PUBLISH_NOTIFY_TO_NOC_TOPIC, msg); } private PublishMsg buildPublishMsg(Env env, ReleaseHistoryBO releaseHistory) { PublishMsg msg = new PublishMsg(); msg.setPriority("δΈ­"); msg.setTool_origin("Apollo"); String appId = releaseHistory.getAppId(); App app = appService.load(appId); msg.setInfluence_bu(app.getOrgName()); msg.setAppid(appId); msg.setAssginee(releaseHistory.getOperator()); msg.setOperation_time(TIMESTAMP_FORMAT.format(releaseHistory.getReleaseTime())); msg.setDesc(gson.toJson(releaseService.compare(env, releaseHistory.getPreviousReleaseId(), releaseHistory.getReleaseId()))); return msg; } private void sendMsg(String serverAddress, String topic, Object msg) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType(MediaType.APPLICATION_OCTET_STREAM + ";charset=UTF-8")); HttpEntity<Object> request = new HttpEntity<>(msg, headers); try { //send msg by hermes RestAPI restTemplate.postForObject(serverAddress + "/topics/" + topic, request, Object.class); } catch (Exception e) { Tracer.logError("Send publish msg to hermes failed", e); } } private class PublishMsg { private String assginee; private String desc; private String operation_time; private String tool_origin; private String priority; private String influence_bu; private String appid; public String getAssginee() { return assginee; } public void setAssginee(String assginee) { this.assginee = assginee; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public String getOperation_time() { return operation_time; } public void setOperation_time(String operation_time) { this.operation_time = operation_time; } public String getTool_origin() { return tool_origin; } public void setTool_origin(String tool_origin) { this.tool_origin = tool_origin; } public String getPriority() { return priority; } public void setPriority(String priority) { this.priority = priority; } public String getInfluence_bu() { return influence_bu; } public void setInfluence_bu(String influence_bu) { this.influence_bu = influence_bu; } public String getAppid() { return appid; } public void setAppid(String appid) { this.appid = appid; } } }