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

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

客户跟我说:“不行”。

我说:“怎么滴?”

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

我心里“呵呵”。

呵呵归呵呵,还是得干。开始我想能不能在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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值