作者 王勇

监控队列与监控交换机,基本完善

@@ -132,6 +132,12 @@ @@ -132,6 +132,12 @@
132 </dependency> 132 </dependency>
133 133
134 <dependency> 134 <dependency>
  135 + <groupId>com.alibaba</groupId>
  136 + <artifactId>fastjson</artifactId>
  137 + <version>1.2.73</version>
  138 + </dependency>
  139 +
  140 + <dependency>
135 <groupId>log4j</groupId> 141 <groupId>log4j</groupId>
136 <artifactId>log4j</artifactId> 142 <artifactId>log4j</artifactId>
137 <version>1.2.17</version> 143 <version>1.2.17</version>
  1 +package com.sunyo.wlpt.message.bus.service.controller.view;
  2 +
  3 +import com.sunyo.wlpt.message.bus.service.response.ResultJson;
  4 +import com.sunyo.wlpt.message.bus.service.service.view.ExchangeFactory;
  5 +import org.springframework.web.bind.annotation.*;
  6 +
  7 +import javax.annotation.Resource;
  8 +import java.io.IOException;
  9 +import java.net.URISyntaxException;
  10 +
  11 +/**
  12 + * @author 子诚
  13 + * Description:
  14 + * 时间:2020/8/27 15:23
  15 + */
  16 +@CrossOrigin
  17 +@RequestMapping("bus/view/exchange")
  18 +@RestController
  19 +public class ViewExchangeController {
  20 +
  21 + @Resource
  22 + private ExchangeFactory exchangeFactory;
  23 +
  24 + @GetMapping("/list")
  25 + public ResultJson getViewExchangeList(
  26 + @RequestParam(value = "serverName", required = false) String serverName,
  27 + @RequestParam(value = "virtualHostName", required = false) String virtualHostName,
  28 + @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
  29 + @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize
  30 + )
  31 + {
  32 + try {
  33 + return exchangeFactory.getViewExchangeList(serverName, virtualHostName, pageNum, pageSize);
  34 + } catch (IOException | URISyntaxException e) {
  35 + return new ResultJson<>("500", "服务器异常,查询交换机监控,失败!请联系管理员");
  36 + }
  37 + }
  38 +}
  1 +package com.sunyo.wlpt.message.bus.service.domain.view;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonProperty;
  4 +import com.rabbitmq.http.client.domain.ExchangeInfo;
  5 +import com.rabbitmq.http.client.domain.ExchangeMessageStats;
  6 +import lombok.AllArgsConstructor;
  7 +import lombok.Builder;
  8 +import lombok.Data;
  9 +import lombok.NoArgsConstructor;
  10 +
  11 +/**
  12 + * @author 子诚
  13 + * Description:
  14 + * 时间:2020/8/31 14:38
  15 + */
  16 +@Data
  17 +@Builder
  18 +@AllArgsConstructor
  19 +@NoArgsConstructor
  20 +public class TempExchangeInfo extends ExchangeInfo {
  21 + @JsonProperty("message_stats")
  22 + private ExchangeMessageStats messageStats;
  23 +}
1 package com.sunyo.wlpt.message.bus.service.domain.view; 1 package com.sunyo.wlpt.message.bus.service.domain.view;
2 2
3 -import com.rabbitmq.http.client.domain.ExchangeInfo; 3 +import com.rabbitmq.http.client.domain.ExchangeMessageStats;
4 import lombok.AllArgsConstructor; 4 import lombok.AllArgsConstructor;
5 import lombok.Builder; 5 import lombok.Builder;
6 import lombok.Data; 6 import lombok.Data;
@@ -20,5 +20,15 @@ import java.io.Serializable; @@ -20,5 +20,15 @@ import java.io.Serializable;
20 public class ViewExchangeInfo implements Serializable { 20 public class ViewExchangeInfo implements Serializable {
21 private static final long serialVersionUID = -3353890396017709770L; 21 private static final long serialVersionUID = -3353890396017709770L;
22 private String serverName; 22 private String serverName;
23 - private ExchangeInfo exchangeInfo; 23 + private TempExchangeInfo tempExchangeInfo;
  24 +
  25 + public long getPublishIn()
  26 + {
  27 + TempExchangeInfo tempExchangeInfo = getTempExchangeInfo();
  28 + ExchangeMessageStats messageStats = tempExchangeInfo.getMessageStats();
  29 + if (messageStats == null) {
  30 + return 0;
  31 + }
  32 + return messageStats.getPublishIn();
  33 + }
24 } 34 }
@@ -2,14 +2,18 @@ package com.sunyo.wlpt.message.bus.service.rabbit.utils; @@ -2,14 +2,18 @@ package com.sunyo.wlpt.message.bus.service.rabbit.utils;
2 2
3 import com.rabbitmq.http.client.Client; 3 import com.rabbitmq.http.client.Client;
4 import com.rabbitmq.http.client.domain.ExchangeInfo; 4 import com.rabbitmq.http.client.domain.ExchangeInfo;
  5 +import com.rabbitmq.http.client.domain.ExchangeMessageStats;
5 import com.rabbitmq.http.client.domain.QueueInfo; 6 import com.rabbitmq.http.client.domain.QueueInfo;
6 import com.rabbitmq.http.client.domain.UserPermissions; 7 import com.rabbitmq.http.client.domain.UserPermissions;
7 import com.sunyo.wlpt.message.bus.service.domain.BusServer; 8 import com.sunyo.wlpt.message.bus.service.domain.BusServer;
8 import com.sunyo.wlpt.message.bus.service.domain.UserInfo; 9 import com.sunyo.wlpt.message.bus.service.domain.UserInfo;
9 import com.sunyo.wlpt.message.bus.service.domain.VirtualHost; 10 import com.sunyo.wlpt.message.bus.service.domain.VirtualHost;
  11 +import com.sunyo.wlpt.message.bus.service.domain.view.TempExchangeInfo;
10 import com.sunyo.wlpt.message.bus.service.domain.view.ViewExchangeInfo; 12 import com.sunyo.wlpt.message.bus.service.domain.view.ViewExchangeInfo;
11 import com.sunyo.wlpt.message.bus.service.domain.view.ViewQueueInfo; 13 import com.sunyo.wlpt.message.bus.service.domain.view.ViewQueueInfo;
12 import com.sunyo.wlpt.message.bus.service.utils.AESUtils; 14 import com.sunyo.wlpt.message.bus.service.utils.AESUtils;
  15 +import org.apache.ibatis.reflection.MetaObject;
  16 +import org.apache.ibatis.reflection.SystemMetaObject;
13 17
14 import java.io.IOException; 18 import java.io.IOException;
15 import java.net.URISyntaxException; 19 import java.net.URISyntaxException;
@@ -242,13 +246,50 @@ public class ClientUtils { @@ -242,13 +246,50 @@ public class ClientUtils {
242 List<ViewExchangeInfo> list = new ArrayList<>(); 246 List<ViewExchangeInfo> list = new ArrayList<>();
243 // 将获取到的队列信息,拼接一个属性,服务器名称 247 // 将获取到的队列信息,拼接一个属性,服务器名称
244 for (ExchangeInfo exchangeInfo : exchanges) { 248 for (ExchangeInfo exchangeInfo : exchanges) {
245 - ViewExchangeInfo viewExchangeInfo = ViewExchangeInfo.builder().serverName(serverName).exchangeInfo(exchangeInfo).build(); 249 + TempExchangeInfo tempExchangeInfo = exchangeInfoToTemp(exchangeInfo);
  250 + ViewExchangeInfo viewExchangeInfo = ViewExchangeInfo.builder().serverName(serverName).tempExchangeInfo(tempExchangeInfo).build();
246 list.add(viewExchangeInfo); 251 list.add(viewExchangeInfo);
247 } 252 }
248 return list; 253 return list;
249 } 254 }
250 255
251 /** 256 /**
  257 + * mybatis封装的反射(根据属性名和对象,获取属性的值)
  258 + *
  259 + * @param fieldName 属性名
  260 + * @param object 对象
  261 + * @return
  262 + */
  263 + private static Object getFieldValueByFieldName(String fieldName, Object object)
  264 + {
  265 + MetaObject metaObject = SystemMetaObject.forObject(object);
  266 + Object value = metaObject.getValue(fieldName);
  267 + return value;
  268 + }
  269 +
  270 + /**
  271 + * 将ExchangeInfo转换成TempExchangeInfo
  272 + *
  273 + * @param exchangeInfo ExchangeInfo
  274 + * @return
  275 + */
  276 + private static TempExchangeInfo exchangeInfoToTemp(ExchangeInfo exchangeInfo)
  277 + {
  278 + ExchangeMessageStats messageStats = (ExchangeMessageStats) getFieldValueByFieldName("messageStats", exchangeInfo);
  279 + TempExchangeInfo temp = new TempExchangeInfo();
  280 + temp.setVhost(exchangeInfo.getVhost());
  281 + temp.setName(exchangeInfo.getName());
  282 + temp.setType(exchangeInfo.getType());
  283 + temp.setDurable(exchangeInfo.isDurable());
  284 + temp.setAutoDelete(exchangeInfo.isAutoDelete());
  285 + temp.setInternal(exchangeInfo.isInternal());
  286 + temp.setArguments(exchangeInfo.getArguments());
  287 + temp.setMessageStats(messageStats);
  288 + return temp;
  289 + }
  290 +
  291 +
  292 + /**
252 * 获取MQ界面的交换机信息,重载 293 * 获取MQ界面的交换机信息,重载
253 * 294 *
254 * @param busServer MQ服务器信息 295 * @param busServer MQ服务器信息
@@ -279,7 +320,8 @@ public class ClientUtils { @@ -279,7 +320,8 @@ public class ClientUtils {
279 { 320 {
280 Client client = connectClient(busServer); 321 Client client = connectClient(busServer);
281 ExchangeInfo exchangeInfo = client.getExchange(vHostName, exchangeName); 322 ExchangeInfo exchangeInfo = client.getExchange(vHostName, exchangeName);
282 - ViewExchangeInfo viewExchangeInfo = ViewExchangeInfo.builder().serverName(busServer.getServerName()).exchangeInfo(exchangeInfo).build(); 323 + TempExchangeInfo tempExchangeInfo = exchangeInfoToTemp(exchangeInfo);
  324 + ViewExchangeInfo viewExchangeInfo = ViewExchangeInfo.builder().serverName(busServer.getServerName()).tempExchangeInfo(tempExchangeInfo).build();
283 return viewExchangeInfo; 325 return viewExchangeInfo;
284 } 326 }
285 327
  1 +package com.sunyo.wlpt.message.bus.service.service.view;
  2 +
  3 +import com.sunyo.wlpt.message.bus.service.domain.BusServer;
  4 +import com.sunyo.wlpt.message.bus.service.domain.VirtualHost;
  5 +import com.sunyo.wlpt.message.bus.service.domain.view.ViewExchangeInfo;
  6 +import com.sunyo.wlpt.message.bus.service.mapper.BusServerMapper;
  7 +import com.sunyo.wlpt.message.bus.service.mapper.VirtualHostMapper;
  8 +import com.sunyo.wlpt.message.bus.service.rabbit.utils.ClientUtils;
  9 +import com.sunyo.wlpt.message.bus.service.response.ResultJson;
  10 +import io.netty.util.internal.StringUtil;
  11 +import org.springframework.stereotype.Service;
  12 +
  13 +import javax.annotation.Resource;
  14 +import java.io.IOException;
  15 +import java.net.URISyntaxException;
  16 +import java.util.ArrayList;
  17 +import java.util.Comparator;
  18 +import java.util.List;
  19 +import java.util.stream.Collectors;
  20 +
  21 +/**
  22 + * @author 子诚
  23 + * Description:
  24 + * 时间:2020/8/27 17:08
  25 + */
  26 +@Service
  27 +public class ExchangeFactory {
  28 +
  29 + @Resource
  30 + private BusServerMapper busServerMapper;
  31 +
  32 + @Resource
  33 + private VirtualHostMapper virtualHostMapper;
  34 +
  35 + public ResultJson getViewExchangeList(String serverName, String virtualHostName, Integer pageNum, Integer pageSize) throws IOException, URISyntaxException
  36 + {
  37 + List<ViewExchangeInfo> list = new ArrayList<>();
  38 +
  39 + // 服务器名称、虚拟主机名称,均为空
  40 + if (StringUtil.isNullOrEmpty(serverName) && StringUtil.isNullOrEmpty(virtualHostName)) {
  41 + List<BusServer> serverList = busServerMapper.getServerList();
  42 + for (BusServer busServer : serverList) {
  43 + List<ViewExchangeInfo> viewExchanges = ClientUtils.getViewExchanges(busServer);
  44 + list.addAll(viewExchanges);
  45 + }
  46 + }
  47 +
  48 + // 仅,服务器名称不为空
  49 + if (!StringUtil.isNullOrEmpty(serverName) && StringUtil.isNullOrEmpty(virtualHostName)) {
  50 + BusServer busServer = busServerMapper.selectByServerName(serverName);
  51 + if (busServer == null) {
  52 + return new ResultJson("400", "该服务器名称不存在,请仔细检查");
  53 + }
  54 + List<ViewExchangeInfo> viewExchanges = ClientUtils.getViewExchanges(busServer);
  55 + list.addAll(viewExchanges);
  56 + }
  57 +
  58 + // 仅,虚拟主机名称不为空
  59 + if (StringUtil.isNullOrEmpty(serverName) && !StringUtil.isNullOrEmpty(virtualHostName)) {
  60 + VirtualHost virtualHost = virtualHostMapper.selectByVirtualHostName(virtualHostName);
  61 + if (virtualHost == null) {
  62 + return new ResultJson("400", "该虚拟主机名称不存在,请仔细检查");
  63 + }
  64 + BusServer busServer = busServerMapper.selectByPrimaryKey(virtualHost.getServerId());
  65 + List<ViewExchangeInfo> viewExchanges = ClientUtils.getViewExchanges(busServer, virtualHostName);
  66 + list.addAll(viewExchanges);
  67 + }
  68 +
  69 + // 服务器名称、虚拟主机名称,均不为空
  70 + if (!StringUtil.isNullOrEmpty(serverName) && !StringUtil.isNullOrEmpty(virtualHostName)) {
  71 + BusServer busServer = busServerMapper.selectByServerName(serverName);
  72 + if (busServer == null) {
  73 + return new ResultJson("400", "该服务器名称不存在,请仔细检查");
  74 + }
  75 + VirtualHost virtualHost = virtualHostMapper.selectByVirtualHostName(virtualHostName);
  76 + if (virtualHost == null) {
  77 + return new ResultJson("400", "该虚拟主机名称不存在,请仔细检查");
  78 + }
  79 + if (!virtualHost.getServerId().equals(busServer.getId())) {
  80 + return new ResultJson("400", "该虚拟主机不属于该服务器,请仔细检查");
  81 + }
  82 + List<ViewExchangeInfo> viewExchanges = ClientUtils.getViewExchanges(busServer, virtualHostName);
  83 + list.addAll(viewExchanges);
  84 + }
  85 +
  86 + Integer total = list.size();
  87 + List<ViewExchangeInfo> resultList = subAndSortList(pageNum, pageSize, list);
  88 + return resultList.size() > 0
  89 + ? new ResultJson<>("200", "查询交换机监控,成功!", resultList, total)
  90 + : new ResultJson<>("500", "查询交换机监控,失败!");
  91 + }
  92 +
  93 + /**
  94 + * 实现排序与分页效果
  95 + *
  96 + * @param pageNum 当前的页数
  97 + * @param pageSize 每页的大小
  98 + * @param list List<ViewExchangeInfo>
  99 + * @return
  100 + */
  101 + private List<ViewExchangeInfo> subAndSortList(Integer pageNum, Integer pageSize, List<ViewExchangeInfo> list)
  102 + {
  103 + Integer start = (pageNum - 1) * pageSize;
  104 + Integer end = start + pageSize;
  105 + Integer total = list.size();
  106 + if (start > total) {
  107 + start = 0;
  108 + end = total;
  109 + }
  110 + if (end > total) {
  111 + end = total;
  112 + }
  113 + List<ViewExchangeInfo> sortedList =
  114 + list.stream().sorted(Comparator.comparing(ViewExchangeInfo::getPublishIn).reversed())
  115 + .collect(Collectors.toList());
  116 + List<ViewExchangeInfo> pageList = sortedList.subList(start, end);
  117 + return pageList;
  118 + }
  119 +}
@@ -92,7 +92,7 @@ public class ViewQueueFactory { @@ -92,7 +92,7 @@ public class ViewQueueFactory {
92 } 92 }
93 93
94 /** 94 /**
95 - * 实现分页与排序效果 95 + * 实现排序与分页效果
96 * 96 *
97 * @param pageNum 开始页 97 * @param pageNum 开始页
98 * @param pageSize 每页大小 98 * @param pageSize 每页大小
@@ -111,11 +111,13 @@ public class ViewQueueFactory { @@ -111,11 +111,13 @@ public class ViewQueueFactory {
111 if (end > total) { 111 if (end > total) {
112 end = total; 112 end = total;
113 } 113 }
114 - List<ViewQueueInfo> pageList = list.subList(start, end); 114 +
115 // 对积压数,进行降序排序 115 // 对积压数,进行降序排序
116 - List<ViewQueueInfo> resultList =  
117 - pageList.stream().sorted(Comparator.comparing(ViewQueueInfo::getMessageReady).reversed()) 116 + List<ViewQueueInfo> sortedList =
  117 + list.stream().sorted(Comparator.comparing(ViewQueueInfo::getMessageReady).reversed())
118 .collect(Collectors.toList()); 118 .collect(Collectors.toList());
  119 + // 分页
  120 + List<ViewQueueInfo> resultList = sortedList.subList(start, end);
119 return resultList; 121 return resultList;
120 } 122 }
121 } 123 }