rufus-scheduler线程在JRuby / Sinatra使用一段时间后死亡

时间:2015-09-28 15:37:43

标签: ruby jruby rufus-scheduler

我们在Mizuno的JRuby 1.7.19上运行了一个sinatra应用程序。按如下方式初始化rufus-scheduler(使用rufus-scheduler 3.0.9):

scheduler = Rufus::Scheduler.new

scheduler.every '1h', :first_in => '30s', :timeout => '30m' do
  Acme::ScheduledNeo4jBackup.new.run
end

工作如下:

module Acme
  class ScheduledNeo4jBackup

    def initialize(rack_env = ENV['RACK_ENV'])
      @rack_env = rack_env
    end

    def run
      if should_run?
        Acme.logger.info "Running neo4j backup from scheduled task"
        Acme::Neo4jBackupTask.run_backup
      else
        Acme.logger.info "Not running neo4j backup from scheduled task as node is not master or standalone"
      end
    end

    def cleanup
      if should_run?
        Acme::Neo4jBackupTask.run_cleanup
      end
    end

    private

    def should_run?
      return false if YamlProperties.backup[:strategy] == 'disable'
      return false if (['test', 'development']).include?(@rack_env)
      ClusterStatus.new.is_master_or_standalone?
    end
  end
end

所以我们有2个主机,其中一个应该记录"从计划任务运行neo4j备份"另一个应该记录"没有从计划任务运行neo4j备份,因为节点不是主节点或独立节点"。

这工作了4天,然后消息停止出现在其中一个主机上。

我使用VisualVM进行了线程转储,发现scheduler.rb线程没有在停止运行rufus作业的主机上运行。

主人不好:

"Ruby-0-Thread-55: .../vendor/bundle/jruby/1.9/gems/rufus-scheduler-3.0.9/lib/rufus/scheduler/jobs.rb:283" - Thread t@150

好主人:

"Ruby-0-Thread-79: .../vendor/bundle/jruby/1.9/gems/rufus-scheduler-3.0.9/lib/rufus/scheduler/jobs.rb:283" - Thread t@175
"Ruby-0-Thread-10: .../vendor/bundle/jruby/1.9/gems/rufus-scheduler-3.0.9/lib/rufus/scheduler.rb:555" - Thread t@21

应用程序没有重新启动,我们没有看到任何堆栈跟踪,似乎scheduler.rb线程只是默默地在其中一个主机上死亡。

使用以下命令行启动应用程序:

"bundle exec mizuno -E $RACK_ENV -D -P $pidfile --start --jmx --threads 10"

我们如何进一步调试?

0 个答案:

没有答案