在监控时,我们的思路大概是这样的,使用rabbitmq的java客户端开发检测端口,发现不符合要求的性能参数,予以警告,给负责人发送短信或邮件,并提供前台可视化的监控界面,大家先看整体设计:
根据这个过程,我们看看数据库设计图:
请参看文章底部《附录:数据库设计》
其中我们用到一个比较关键的方法,在官方api中如此介绍:
RabbitMQ监控类:
@Service("rabbitMQService")
public class RabbitMQServiceImpl implements IRabbitMQService, IDebugService {
@Override
public Boolean checkOneBusinessMQ(Business business) throws Exception {
if(business == null ){
return false;
}
boolean isFinish=false;
Channel channel = null;
Connection conn = null;
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername(business.getMqUsername());
factory.setPassword(business.getMqPassword());
if(!(business.getMqVirtualhost()==null || business.getMqVirtualhost().trim().isEmpty() || business.getMqVirtualhost().equals("no"))){
factory.setVirtualHost(business.getMqVirtualhost());
}
factory.setHost(business.getMqHost());
factory.setPort(Integer.valueOf(business.getMqPort()));
try {
conn = factory.newConnection();
channel = conn.createChannel();
long count = channel.messageCount(business.getMqQueueName());
HashMap hashMap = JSON.parseObject(business.getWarningconfig(),HashMap.class);
Integer max=Integer.valueOf(hashMap.get(RabbitMQ.WarningConfig_Max.getValue()));
try {
FileSaveMq.addOneBusinessDate(business.getId().toString(), count + "");
}catch (Exception e){
log.error("=checkOneBusinessMQ=>error write file"+business.getBusinessName(),e);
}
if(count <=max){
isFinish=true;
}else{
isFinish=false;
isFinish = sendWarningOnebusiness(business);
}
}catch(Exception e){
log.error("=checkOneBusinessMQ=>error business name:"+business.getBusinessName(),e);
sendWarningOnebusiness(business);
}finally {
if(channel !=null){
channel.close();
if(conn != null){
conn.close();
}
}
}
return isFinish;
}
@Override
public Boolean checkOneService(ControlService controlService) throws Exception {
if(controlService == null ){
return false;
}
boolean isFinish=false;
if(URLUtils.isConnect(controlService.getServiceUrl())){
isFinish=true;
}else{
isFinish = sendWarningOneservice(controlService);
isFinish=false;
}
return isFinish;
}
}
有了核心代码,其他的都是辅助其实现的工具,在这个基础之上,我们就可以扩展我们的思路,想想如何做页面展示,如何发送短信,邮件等,看似高大上的技术,其实也是简单技术的积累加上人的大脑创新!现在看看,“世上无难事,只怕有心人”这句话,真的是至理名言!
File帮助类:
/**
* Created by Administrator on 2016/3/22.
*/
public class FileSaveMq {
public static void addOneBusinessDate(String key,String value){
String json = getDate();
HashMap hashMap = null;
List listvalue=null;
if(json==null||json.trim().isEmpty()){
hashMap=new HashMap();
}else{
hashMap = JSON.parseObject(json,HashMap.class);
}
if(hashMap.containsKey(key)){
String OneValueJson = hashMap.get(key);
if(OneValueJson==null ||OneValueJson.trim().isEmpty()){
listvalue = new ArrayList();
listvalue.add(value);
}else{
listvalue = JSON.parseObject(OneValueJson, List.class);
listvalue.add(value);
if(listvalue.size()>100){
listvalue.remove(listvalue.size()-1);
}
}
}else{
listvalue = new ArrayList();
listvalue.add(value);
}
hashMap.put(key,JSON.toJSONString(listvalue));
addDate(JSON.toJSONString(hashMap));
}
public static void addDate(String oneValue){
File file = new File("D://export/date/mq.log");
if(!file.canWrite()){
try {
file.createNewFile();
}catch (Exception e){
e.printStackTrace();
}
}
try {
FileUtils.write(file, oneValue);
}catch (Exception e1){
e1.printStackTrace();
}
}
public static String getDate(){
File file = new File("D://export/date/mq.log");
if(!file.canRead()){
try {
file.createNewFile();
}catch (Exception e){
e.printStackTrace();
}
}
String result = "";
try {
result =FileUtils.readFileToString(file);
}catch (Exception e){
e.printStackTrace();
}
return result;
}
}
数据库设计(部分字段已经改动):
d_responsible_user(责任人)
字段名称 |
类型 |
必填 |
备注 |
id |
integer |
y |
id |
username |
string |
y |
用户名(未来登录用) |
password |
string |
y |
密码(未来登录用) |
chinesename |
string |
y |
中文姓名 |
mobile |
integer |
y |
手机号 |
|
string |
y |
邮箱 |
remark |
string |
y |
备注 |
created |
timestamp |
n |
创建时间 |
modified |
timestamp |
n |
修改时间 |
createusername |
string |
n |
创建人 |
d_service(需要监控的服务)
字段名称 |
类型 |
必填 |
备注 |
id |
integer |
y |
id |
servicename |
string |
y |
服务名称 |
serviceurl |
string |
y |
服务监控地址 |
warningmsg |
string |
y |
报警信息 |
remark |
string |
n |
备注 |
created |
timestamp |
n |
创建时间 |
modified |
timestamp |
n |
修改时间 |
createusername |
string |
n |
创建人 |
d_service_user(服务与负责人关系)
字段名称 |
类型 |
必填 |
备注 |
id |
integer |
y |
id |
serviceid |
integer |
y |
服务id |
servicename |
string |
y |
服务名称 |
uid |
integer |
y |
用户id |
chinesename |
string |
y |
中文名称 |
isemail |
integer |
y |
报警是否发邮件 |
ismessage |
integer |
y |
报警是否发短信 |
remark |
string |
n |
备注 |
created |
timestamp |
n |
创建时间 |
modified |
timestamp |
n |
修改时间 |
createusername |
string |
n |
创建人 |
d_ business(需要监控的业务)
字段名称 |
类型 |
必填 |
备注 |
id |
integer |
y |
id |
businessname |
string |
y |
业务名称 |
mqhost |
string |
y |
mqhost |
mqport |
string |
y |
mq端口 |
mqusername |
string |
y |
mq用户名 |
mqpassword |
string |
y |
mq密码 |
mqvirtualhost |
string |
y |
mq虚拟host |
mqconnectiontimeout |
string |
y |
mq链接超时 |
warningconfig |
string |
y |
警告策略(阻塞值等) |
remark |
string |
n |
备注 |
created |
timestamp |
n |
创建时间 |
modified |
timestamp |
n |
修改时间 |
createusername |
string |
n |
创建人 |
d_ business_user(监控的业务与用户关系)
字段名称 |
类型 |
必填 |
备注 |
id |
integer |
y |
id |
businessid |
integer |
y |
业务id |
businessname |
string |
y |
业务名称 |
uid |
integer |
y |
用户id |
isemail |
integer |
y |
报警是否发邮件 |
ismessage |
integer |
y |
报警是否发短信 |
remark |
string |
n |
备注 |
created |
timestamp |
n |
创建时间 |
modified |
timestamp |
n |
修改时间 |
createusername |
string |
n |
创建人 |