我们在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"
我们如何进一步调试?