关于spring + quartz 定时启动集群问题

来源:互联网 发布:电魂网络官网 编辑:程序博客网 时间:2024/05/24 05:42

客户最近想做负载均衡,那我就说做呗,留一个服务器的定时,剩余的干掉。

客户跟我说:“不行”。

我说:“怎么滴?”

他的意思每次他们都是傻瓜式全量更新,手动去改配置文件极易出错,万一哪天运维喝多了,忘记删一个服务器的定时,那事不就大了么。

我心里“呵呵”。

呵呵归呵呵,还是得干。开始我想能不能在spring 装载的时候干掉定时总调度的bean,于是我写了一个ApplicationListener的实现类,每次项目启动后去找定时调度的StdScheduler,然后shutdown,貌似解决了这个问题。但是我发现,有瑕疵。假如这个运维很有意思,在定时启动的时间例如9点半这个时候取重启项目,那么受到加载顺序的影响,定时任务的执行顺序要比你shutdown的执行顺序靠前,总有一些会被执行。或者有那种一秒一次的定时任务,这种问题依然存在。

那么如何是好?

没招了,改基类吧。把quartz的包拿出来,反编译。QuartzScheduler这个类第363行找到statr()方法。我看到了调度器和监听器都在这个方法里被启用,那么我可以在这个方法里控制。既然客户不想改项目的配置文件,想一劳永逸,那么tomcat的环境你不会改吧。那好吧,http://www.cnblogs.com/yangmingke/p/6058898.html 根据这篇文章的介绍,我修改了tomcat的配置,然后在系统里加判断

 public void start()
    throws SchedulerException
  {
    String value = System.getProperty("scheduler.start");
    if("true".equals(value)){
        if ((this.shuttingDown) || (this.closed)) {
          throw new SchedulerException("The Scheduler cannot be restarted after shutdown() has been called.");
        }
        if (this.initialStart == null)
        {
          this.initialStart = new Date();
          this.resources.getJobStore().schedulerStarted();
          startPlugins();
        }
        this.schedThread.togglePause(false);
        
        getLog().info("Scheduler " + this.resources.getUniqueIdentifier() + " started.");
        
    
        notifySchedulerListenersStarted();
    }
  }

经测试,符合了客户的要求。

1 0
原创粉丝点击