美文网首页
程序探活

程序探活

作者: 不存在的bug | 来源:发表于2020-07-05 21:15 被阅读0次

背景:xxl-job定时跑批,本地创建专门线程监测定时任务是否执行了,防止xxl-job挂了,及时通知。

@Slf4j
@Component
public final class DetectSubcriber implements DisposableBean,Runnable {

    private static final SimpleDateFormat formatdate = new SimpleDateFormat("YYYY-MM-dd");
    private static final SimpleDateFormat formatTime = new SimpleDateFormat("HH:mm");

    private final Thread thread;
    public static volatile Date jobExecDate; //由xxl-job任务线程修改,执行过了的设置当前时间
    public static Boolean detectSelfExecFalg = true; //控制当前探测只发送一次提醒

    private String specifiedFinishTime;  //指定一个定时任务完成之后的时间点
    private Long detectIntervalTime; //探测间隔时间,没必要一直跑,合理即可

    private DetectSubcriber(@Value("${specified.finish.time}")String specifiedFinishTime,
                            @Value("${detect.interval.time}")Long detectIntervalTime,
                            @Autowired TeacherLiveJobHandler teacherLiveJobHandler){
        this.specifiedFinishTime = specifiedFinishTime;
        this.detectIntervalTime = detectIntervalTime;
        this.teacherLiveJobHandler = teacherLiveJobHandler;
        this.thread = new Thread(this);
        this.thread.setDaemon(true);
        this.thread.start();
    }

    @Override
    public void run() {

        try {
            final Date finishTime = formatTime.parse(specifiedFinishTime);
            while(true){

                Thread.sleep(detectIntervalTime); //应该先执行,防止系统启动之后就会触发探测报警
                final boolean jobNotExec = jobExecDate == null || !formatdate.format(jobExecDate).equals(formatdate.format(new Date()));
                final Date currentTime = formatTime.parse(formatTime.format(new Date()));

                if (currentTime.before(finishTime)) {
                    detectSelfExecFalg = true; //在该时间段开启
                }

                if (jobNotExec && detectSelfExecFalg && currentTime.after(finishTime)) {

                    detectSelfExecFalg = false; //在currentTime.after(finishTime)内执行一次就行
                    log.info("xxl-job未执行,触发探活执行。");
                    //xxl-job挂了,由当前线程触发
                    try {
                        //todo 触发定时
                    }catch (Exception e){
                        log.error("",e);
                    }

                    //todo 发送报警

                }

            }
        }catch (Exception e){
            if (specifiedFinishTime == null) {
                log.error("启动探活必须指定开始时间(探活开始时间的时间点)【specified.finish.time】。");
            }
            log.error("探活程序报错:",e);
        }

    }

    @Override
    public void destroy() throws Exception {
        jobExecDate = null;
    }

}

另一个线程:

DetectSubcriber.jobExecDate = new Date(); //应该先执行,下面任务的成功失败和探活无关。不能因为下面任务失败而导致触发探活报警。任务应该有自己的报警
 //todo 跑批核心任务        

写在后面

这个有必要吗?个人觉得没必要,本身xxl-job肯定是集群部署,故障率很低,万一要是发生了,那应该也是由运维人员及时修复。另一个发生故障的可能就是物理故障,如果都部署在同一台机器那也没啥毛用,不过一般是不会这么部署。同意这么做只是不想费口舌,再者是觉得这挺好玩。一些补偿措施不能为了甩锅而补偿。这程序可能几年也不会触发......

相关文章

  • 程序探活

    背景:xxl-job定时跑批,本地创建专门线程监测定时任务是否执行了,防止xxl-job挂了,及时通知。 另一个线...

  • Soul源码阅读 ip端口探活&SpringCloud集成原理【

    ip端口探活 admin中的探活主要使用UpstreamCheckService这个类 关键代码解析 一开始的时候...

  • Soul网关的探活--基于zookeeper同步数据的解析

    Soul网关的探活--基于zookeeper同步数据的解析 Soul网关的探活,主要分为两部分,第一部分是soul...

  • 一将倾城

    一个程序员,探宝,颠覆传统战争的故事。

  • 想知道如何写一个网络包探嗅器吗?Python教你

    基本嗅探器 嗅探器是一种程序,它可以逐包捕获/嗅探/检测网络流量包,并对其进行各种原因的分析。常用于网络安全领域。...

  • 小程序or抖音

    今天老匡出了新文章,关于小程序的,分享了几个行业案例。小程序目前月活已经4亿,日活2.3亿。抖音月活5亿,日活2....

  • 网管必备

    根据每个机器的日志记录规则,awk print 的index可能不一样 查找恶意的嗅探IP 被嗅探程序光顾的多了,...

  • 《热血长安》值得你追的烧脑悬疑剧!

    你看过神探狄仁杰,知道福尔摩斯,那么萨摩多罗你可不能不知道哟! 因为同样作为足智多谋的神探,可他还兼备搞笑能力,活...

  • 微信小程序开发感受

    最近微信小程序很火爆,也试水开发一款小程序探一下市场。经过一周的开发小程序开发完成,也积攒了部分经验,和小程序优秀...

  • 【小程序直播】探坑之路

    公司需要做小程序直播,然后我们就开始了小程序直播探索之旅;虽则小程序直播是很简单,但我们是第三方服务商;小程序直播...

网友评论

      本文标题:程序探活

      本文链接:https://www.haomeiwen.com/subject/zerbqktx.html