zoukankan      html  css  js  c++  java
  • springboot-admin自定义事件通知

    springboot-admin组建已经提供了很多开箱即用的通知器(例如邮件),但在有些业务场景下我们需要做一些企业内部的通知渠道,这就需要我们来自定义通知器。

    实现其实很简单,只需要往spring注入一个Notifier类型的实例即可。

    当然,我们不会直接实现Notifier,而是选择继承AbstractStatusChangeNotifier。

    import java.net.URL;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import org.springframework.stereotype.Service;
    
    import com.google.gson.Gson;
    import com.google.gson.JsonObject;
    
    import de.codecentric.boot.admin.event.ClientApplicationEvent;
    import de.codecentric.boot.admin.event.ClientApplicationStatusChangedEvent;
    import de.codecentric.boot.admin.model.Application;
    import de.codecentric.boot.admin.notify.AbstractStatusChangeNotifier;
    import lombok.extern.slf4j.Slf4j;
    
    /**
     * 自定义的事件通知者
     * @author yangzhilong
     *
     */
    @Slf4j
    @Service
    public class CustomNotifier extends AbstractStatusChangeNotifier {
        @Override
        protected void doNotify(ClientApplicationEvent event) throws Exception {
            if (event instanceof ClientApplicationStatusChangedEvent) {
                ClientApplicationStatusChangedEvent statusChange = (ClientApplicationStatusChangedEvent) event;
                // down表示服务里部分中间件有问题
                // offline表示服务无法http访问了
                //if ((statusChange.getTo().isOffline() || statusChange.getTo().isDown()) && !statusChange.getFrom().isUnknown()) {
                if (statusChange.getTo().isOffline() && !statusChange.getFrom().isUnknown()) {
                    DateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Application application = event.getApplication();
                    // 服务名称
                    String appName = application.getName();
                    // 实例名称(在eureka中注册的唯一id)
                    String instance = application.getId();
                    // 事件发生的时间
                    String time = sf.format(new Date(event.getTimestamp()));
                    // 服务器的ip
                    URL url = new URL(statusChange.getApplication().getServiceUrl());
                    String server = url.getHost();
                    
                    // 封装成自定义事件对象
                    JsonObject json = new JsonObject();
                    json.addProperty("appName", appName.concat(":").concat(instance));
                    json.addProperty("server", server);
                    json.addProperty("from", statusChange.getFrom().getStatus());
                    json.addProperty("to", statusChange.getTo().getStatus());
                    json.addProperty("time", time);
                    // 事件的全部信息
                    json.addProperty("details", new Gson().toJson(event));
                    
                    log.warn("warn event !!!!,content is:{}", json.toString());
                }
            }
        }
    
        @Override
        protected boolean shouldNotify(ClientApplicationEvent event) {
            return super.shouldNotify(event);
        }
    }

    需要说明的是:当调用pause或者erueka的rest来下线服务,并预留点时间后kill服务是不会被认为是告警,直接kill 或者 shutdown是会被认为是异常下线的。

  • 相关阅读:
    LinuxMySQL主从复制原理图
    flask中间件请求流程
    flask02
    flask01
    笔记本电脑播放声音前后会有吱吱声
    筛法欧拉函数
    矩阵快速幂
    最短路 P1144 最短路计数【Dijkstra堆优化/SPFA】
    SPFA算法以及负环判断【模板】
    最短路 P1629 邮递员送信 【反向图求最短路】
  • 原文地址:https://www.cnblogs.com/yangzhilong/p/10721940.html
Copyright © 2011-2022 走看看