From 0a9ad1dfb635bf0c5d29819facecbbc40aaee9e7 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Fri, 13 Apr 2012 12:10:47 +0800 Subject: [PATCH 1/6] starting Resque --- Gemfile | 2 ++ Gemfile.lock | 18 ++++++++++++++ app/jobs/fetch_time.rb | 11 +++++++++ app/mailer/cron_mail.rb | 8 ++++++ config/environments/development.rb | 22 ++++++++--------- config/initializers/resque.rb | 15 ++++++++++++ config/resque.yml | 2 ++ config/resque_schedule.yml | 6 +++++ config/routes.rb | 1 + lib/tasks/anc_tasks.rake | 1 + lib/tasks/resque.rake | 39 ++++++++++++++++++++++++++++++ 11 files changed, 114 insertions(+), 11 deletions(-) create mode 100644 app/jobs/fetch_time.rb create mode 100644 app/mailer/cron_mail.rb create mode 100644 config/initializers/resque.rb create mode 100644 config/resque.yml create mode 100644 config/resque_schedule.yml create mode 100644 lib/tasks/resque.rake diff --git a/Gemfile b/Gemfile index d1afdb8c..a6b96ff2 100644 --- a/Gemfile +++ b/Gemfile @@ -19,6 +19,8 @@ gem "mongo_session_store-rails3" gem 'nokogiri' gem 'radius' gem 'rake' +gem 'resque-scheduler', :require => 'resque_scheduler' +gem 'resque', :require => "resque/server" gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/Gemfile.lock b/Gemfile.lock index 71742974..80ce363c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -153,6 +153,18 @@ GEM rake (0.9.2.2) rdoc (3.12) json (~> 1.4) + redis (2.2.2) + redis-namespace (1.0.3) + redis (< 3.0.0) + resque (1.20.0) + multi_json (~> 1.0) + redis-namespace (~> 1.0.2) + sinatra (>= 0.9.2) + vegas (~> 0.1.2) + resque-scheduler (1.9.9) + redis (>= 2.0.1) + resque (>= 1.8.0) + rufus-scheduler rspec (2.8.0) rspec-core (~> 2.8.0) rspec-expectations (~> 2.8.0) @@ -182,6 +194,8 @@ GEM ruby_parser (2.3.1) sexp_processor (~> 3.0) rubyzip (0.9.6.1) + rufus-scheduler (2.0.16) + tzinfo (>= 0.3.23) ruport (1.6.3) fastercsv pdf-writer (= 1.1.8) @@ -222,6 +236,8 @@ GEM uglifier (1.2.3) execjs (>= 0.3.0) multi_json (>= 1.0.2) + vegas (0.1.11) + rack (>= 1.0.0) warden (1.1.1) rack (>= 1.0) watchr (0.7) @@ -259,6 +275,8 @@ DEPENDENCIES radius rails (>= 3.1.0, < 3.2.0) rake + resque + resque-scheduler rspec (~> 2.0) rspec-rails (~> 2.0) ruby-debug19 diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb new file mode 100644 index 00000000..70e58b2b --- /dev/null +++ b/app/jobs/fetch_time.rb @@ -0,0 +1,11 @@ +require 'open-uri' +require 'nokogiri' +module FetchTime + @queue = :fetch_time + + def self.perform() + sleep 10 + doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + CronMail.time_check(doc.at('#ct').children.first.text).deliver + end +end diff --git a/app/mailer/cron_mail.rb b/app/mailer/cron_mail.rb new file mode 100644 index 00000000..8a4c9700 --- /dev/null +++ b/app/mailer/cron_mail.rb @@ -0,0 +1,8 @@ +class CronMail < ActionMailer::Base + default :from => "orbit_test@rulingcom.com" + + def time_check(msg) + #attachments["rails.png"] = File.read("#{Rails.root}/public/images/rails.png") + mail(:to => "Matt ", :subject => msg) + end +end \ No newline at end of file diff --git a/config/environments/development.rb b/config/environments/development.rb index 1dbff032..20f4519b 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -29,16 +29,16 @@ Orbit::Application.configure do # :sender_address => %{"notifier" }, # :exception_recipients => %w{chris@rulingcom.com} - # config.action_mailer.delivery_method = :smtp - # config.action_mailer.smtp_settings = { - # :tls => true, - # :enable_starttls_auto => true, - # :address => "smtp.gmail.com", - # :port => '587', - # :domain => "smtp.gmail.com", - # :authentication => "plain", - # :user_name => "redmine@rulingcom.com", - # :password => "rulingredmine" } - + config.action_mailer.delivery_method = :smtp + config.action_mailer.smtp_settings = { + :tls => true, + :enable_starttls_auto => true, + :address => "smtp.gmail.com", + :port => '587', + :domain => "smtp.gmail.com", + :authentication => "plain", + :user_name => "redmine@rulingcom.com", + :password => "rulingredmine" } + end diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb new file mode 100644 index 00000000..69eabc9c --- /dev/null +++ b/config/initializers/resque.rb @@ -0,0 +1,15 @@ +require 'resque_scheduler' +require 'resque_scheduler/server' +require 'yaml' + +rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..' +rails_env = ENV['RAILS_ENV'] || 'development' + +resque_config = YAML.load_file(rails_root + '/config/resque.yml') +Resque.redis = resque_config[rails_env] + +Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml") +Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file } + +# current_path = Rails.root.to_s.gsub(/\s/,'\ ') +# queues = [:test] diff --git a/config/resque.yml b/config/resque.yml new file mode 100644 index 00000000..f874633c --- /dev/null +++ b/config/resque.yml @@ -0,0 +1,2 @@ +development: localhost:6379 +production: localhost:6379 diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml new file mode 100644 index 00000000..08b1b7ea --- /dev/null +++ b/config/resque_schedule.yml @@ -0,0 +1,6 @@ +time_to_talk_a_rest: + cron: "*/5 * * * *" + class: FetchTime + queue: daemons + rails_env: development + description: Send Email for Remind Time diff --git a/config/routes.rb b/config/routes.rb index 99860bb6..51044970 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,6 +12,7 @@ Orbit::Application.routes.draw do # routes for admin namespace :admin do + mount Resque::Server.new, :at => "/resque" resources :assets resources :app_auths resources :object_auths do diff --git a/lib/tasks/anc_tasks.rake b/lib/tasks/anc_tasks.rake index cd534b93..a97e1830 100644 --- a/lib/tasks/anc_tasks.rake +++ b/lib/tasks/anc_tasks.rake @@ -1,3 +1,4 @@ +require 'resque_scheduler/tasks' # encoding: utf-8 namespace :anc do diff --git a/lib/tasks/resque.rake b/lib/tasks/resque.rake new file mode 100644 index 00000000..66841c72 --- /dev/null +++ b/lib/tasks/resque.rake @@ -0,0 +1,39 @@ +# require "resque/tasks" +# require 'resque/scheduler' +# require 'resque/scheduler' + +# +# task "resque:setup" => :environment +# Resque tasks +require 'resque/tasks' +require 'resque_scheduler/tasks' + +namespace :resque do + task :setup => :environment do + require 'resque' + require 'resque_scheduler' + require 'resque/scheduler' + + # you probably already have this somewhere + Resque.redis = 'localhost:6379' + + # If you want to be able to dynamically change the schedule, + # uncomment this line. A dynamic schedule can be updated via the + # Resque::Scheduler.set_schedule (and remove_schedule) methods. + # When dynamic is set to true, the scheduler process looks for + # schedule changes and applies them on the fly. + # Note: This feature is only available in >=2.0.0. + #Resque::Scheduler.dynamic = true + + # The schedule doesn't need to be stored in a YAML, it just needs to + # be a hash. YAML is usually the easiest. + Resque.schedule = YAML.load_file('config/resque_schedule.yml') + + # If your schedule already has +queue+ set for each job, you don't + # need to require your jobs. This can be an advantage since it's + # less code that resque-scheduler needs to know about. But in a small + # project, it's usually easier to just include you job classes here. + # So, someting like this: + #require 'jobs' + end +end \ No newline at end of file From a2277d7ea58cdf797edee9205add92bdaf7db4ca Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Mon, 7 May 2012 10:23:16 +0800 Subject: [PATCH 2/6] now jobs is working --- Gemfile | 4 ++-- app/jobs/fetch_time.rb | 14 ++++++++------ config/initializers/resque.rb | 23 ++++++++++++++--------- config/resque.yml | 2 -- config/resque_schedule.yml | 9 ++++----- config/routes.rb | 2 +- 6 files changed, 29 insertions(+), 25 deletions(-) delete mode 100644 config/resque.yml diff --git a/Gemfile b/Gemfile index a6b96ff2..6e6bc39c 100644 --- a/Gemfile +++ b/Gemfile @@ -19,8 +19,8 @@ gem "mongo_session_store-rails3" gem 'nokogiri' gem 'radius' gem 'rake' -gem 'resque-scheduler', :require => 'resque_scheduler' -gem 'resque', :require => "resque/server" +gem 'resque' # background jobs +gem 'resque-scheduler' # job scheduling gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb index 70e58b2b..7758cace 100644 --- a/app/jobs/fetch_time.rb +++ b/app/jobs/fetch_time.rb @@ -1,11 +1,13 @@ -require 'open-uri' -require 'nokogiri' +# require 'open-uri' +# require 'nokogiri' module FetchTime - @queue = :fetch_time + @queue = :my_job_queue def self.perform() - sleep 10 - doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) - CronMail.time_check(doc.at('#ct').children.first.text).deliver +# sleep 10 + # doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + # CronMail.time_check(doc.at('#ct').children.first.text).deliver + # puts "Mail Sent" + # true end end diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb index 69eabc9c..69a535f3 100644 --- a/config/initializers/resque.rb +++ b/config/initializers/resque.rb @@ -1,15 +1,20 @@ require 'resque_scheduler' -require 'resque_scheduler/server' -require 'yaml' +# require 'resque_scheduler/server' +# require 'yaml' -rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..' -rails_env = ENV['RAILS_ENV'] || 'development' +Resque.redis = 'localhost:6379' +Resque.redis.namespace = "resque:SchedulerExample" -resque_config = YAML.load_file(rails_root + '/config/resque.yml') -Resque.redis = resque_config[rails_env] +# If you want to be able to dynamically change the schedule, +# uncomment this line. A dynamic schedule can be updated via the +# Resque::Scheduler.set_schedule (and remove_schedule) methods. +# When dynamic is set to true, the scheduler process looks for +# schedule changes and applies them on the fly. +# Note: This feature is only available in >=2.0.0. +#Resque::Scheduler.dynamic = true -Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml") Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file } -# current_path = Rails.root.to_s.gsub(/\s/,'\ ') -# queues = [:test] +# The schedule doesn't need to be stored in a YAML, it just needs to +# be a hash. YAML is usually the easiest. +Resque.schedule = YAML.load_file(Rails.root.join('config', 'resque_schedule.yml')) \ No newline at end of file diff --git a/config/resque.yml b/config/resque.yml deleted file mode 100644 index f874633c..00000000 --- a/config/resque.yml +++ /dev/null @@ -1,2 +0,0 @@ -development: localhost:6379 -production: localhost:6379 diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 08b1b7ea..6c960ede 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -1,6 +1,5 @@ -time_to_talk_a_rest: - cron: "*/5 * * * *" +do_my_job: + every: 30s class: FetchTime - queue: daemons - rails_env: development - description: Send Email for Remind Time + args: + description: Runs the perform method in MyJob diff --git a/config/routes.rb b/config/routes.rb index 51044970..f84063da 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ Orbit::Application.routes.draw do - + mount Resque::Server, :at => "/admin/resque" devise_for :users # routes for sinatra app From 8ff36ee76c03b976f78a93d15200907dc4c3f903 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Tue, 8 May 2012 11:31:35 +0800 Subject: [PATCH 3/6] God , Resque, Resque-schedule, is working,but buggy. Need to combine with LDAP and also implement XML calendar sync. --- Gemfile | 1 + Gemfile.lock | 3 ++ Rakefile | 2 ++ app/jobs/fetch_time.rb | 14 +++++---- app/jobs/nccu_calendar.rb | 8 +++++ app/jobs/sync_db.rb | 9 ++++++ config/application.rb | 2 ++ config/initializers/resque.rb | 2 +- config/resque.god | 55 ++++++++++++++++++++++++++++++++++ config/resque_schedule.yml | 18 +++++++++-- dump.rdb | Bin 0 -> 899 bytes 11 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 app/jobs/nccu_calendar.rb create mode 100644 app/jobs/sync_db.rb create mode 100644 config/resque.god create mode 100644 dump.rdb diff --git a/Gemfile b/Gemfile index 6e6bc39c..d6129092 100644 --- a/Gemfile +++ b/Gemfile @@ -21,6 +21,7 @@ gem 'radius' gem 'rake' gem 'resque' # background jobs gem 'resque-scheduler' # job scheduling +gem 'resque-restriction' gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/Gemfile.lock b/Gemfile.lock index 80ce363c..16acce21 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -161,6 +161,8 @@ GEM redis-namespace (~> 1.0.2) sinatra (>= 0.9.2) vegas (~> 0.1.2) + resque-restriction (0.3.0) + resque (>= 1.7.0) resque-scheduler (1.9.9) redis (>= 2.0.1) resque (>= 1.8.0) @@ -276,6 +278,7 @@ DEPENDENCIES rails (>= 3.1.0, < 3.2.0) rake resque + resque-restriction resque-scheduler rspec (~> 2.0) rspec-rails (~> 2.0) diff --git a/Rakefile b/Rakefile index 9a495de7..e0dc9c5b 100644 --- a/Rakefile +++ b/Rakefile @@ -1,7 +1,9 @@ +# /usr/bin/ruby -Ku # Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. require File.expand_path('../config/application', __FILE__) +require 'resque/tasks' require 'rake/dsl_definition' require 'rake' diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb index 7758cace..5fce3036 100644 --- a/app/jobs/fetch_time.rb +++ b/app/jobs/fetch_time.rb @@ -1,13 +1,15 @@ # require 'open-uri' # require 'nokogiri' -module FetchTime - @queue = :my_job_queue +class FetchTime < Resque::Plugins::RestrictionJob + restrict :per_300 => 10 + + @queue = :low def self.perform() # sleep 10 - # doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) - # CronMail.time_check(doc.at('#ct').children.first.text).deliver - # puts "Mail Sent" - # true + doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + CronMail.time_check(doc.at('#ct').children.first.text).deliver + puts "Mail Sent" + true end end diff --git a/app/jobs/nccu_calendar.rb b/app/jobs/nccu_calendar.rb new file mode 100644 index 00000000..724804d4 --- /dev/null +++ b/app/jobs/nccu_calendar.rb @@ -0,0 +1,8 @@ +class NccuCalendar + @queue = :high + + def self.perform() +# sleep 10 + puts "NccuCalendar Sync" + end +end diff --git a/app/jobs/sync_db.rb b/app/jobs/sync_db.rb new file mode 100644 index 00000000..f6458204 --- /dev/null +++ b/app/jobs/sync_db.rb @@ -0,0 +1,9 @@ +class SyncDb + + @queue = :high + + def self.perform() +# sleep 10 + puts "DB Sync" + end +end diff --git a/config/application.rb b/config/application.rb index cef8c446..8460d136 100644 --- a/config/application.rb +++ b/config/application.rb @@ -62,6 +62,8 @@ module Orbit # Enable the asset pipeline config.assets.enabled = true + #config.time_zone = 'Taipei' + ENV['TZ'] = 'Asia/Taipei' end end Orbit_Apps = [] diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb index 69a535f3..f6f08406 100644 --- a/config/initializers/resque.rb +++ b/config/initializers/resque.rb @@ -3,7 +3,7 @@ require 'resque_scheduler' # require 'yaml' Resque.redis = 'localhost:6379' -Resque.redis.namespace = "resque:SchedulerExample" +#Resque.redis.namespace = "resque:SchedulerExample" # If you want to be able to dynamically change the schedule, # uncomment this line. A dynamic schedule can be updated via the diff --git a/config/resque.god b/config/resque.god new file mode 100644 index 00000000..6c4e4bde --- /dev/null +++ b/config/resque.god @@ -0,0 +1,55 @@ +rails_env = 'development' #ENV['RAILS_ENV'] || "production" +rails_root = ENV['RAILS_ROOT'] || "/Users/kaito/Documents/MyWorkspeace/orbit/orbit" +num_workers = rails_env == 'production' ? 5 : 2 + +num_workers.times do |num| + God.watch do |w| + w.dir = "#{rails_root}" + w.name = "resque-#{num}" + w.group = 'resque' + w.interval = 30.seconds + p "/usr/bin/rake -f #{rails_root}/Rakefile resque:work QUEUE=* RAILS_ENV=#{rails_env}" +# w.env = {"QUEUE"=>"critical,high,low", "RAILS_ENV"=>rails_env} + w.start = "rake -f #{rails_root}/Rakefile resque:work QUEUE=* RAILS_ENV=#{rails_env}" + + w.uid = 'kaito' + w.gid = 'staff' + + # restart if memory gets too high + w.transition(:up, :restart) do |on| + on.condition(:memory_usage) do |c| + c.above = 350.megabytes + c.times = 2 + end + end + + # determine the state on startup + w.transition(:init, { true => :up, false => :start }) do |on| + on.condition(:process_running) do |c| + c.running = true + end + end + + # determine when process has finished starting + w.transition([:start, :restart], :up) do |on| + on.condition(:process_running) do |c| + c.running = true + c.interval = 5.seconds + end + + # failsafe + on.condition(:tries) do |c| + c.times = 5 + c.transition = :start + c.interval = 5.seconds + end + end + + # start if process is not running + w.transition(:up, :start) do |on| + on.condition(:process_running) do |c| + c.running = false + end + end + end +end \ No newline at end of file diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 6c960ede..10f97f5f 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -1,5 +1,17 @@ -do_my_job: - every: 30s +do_mail_matt: + every: 10s class: FetchTime args: - description: Runs the perform method in MyJob + description: Runs the perform method in FetchTime + +nccu_daily_ldap_sync: + cron: 30 * * * * * + class: SyncDb + args: + description: Runs the perform method in SnycDB + +nccu_claender_sync: + every: 1m + class: NccuCalendar + args: + description: Runs the perform method in NccuCalendar \ No newline at end of file diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..e5b34fe1d130ce07b54b42b5af7c97f58de85954 GIT binary patch literal 899 zcmaizPfNov7{;@@t0JPHAWn1eFde+<+N{gfP4MEuc@qyYjcc*{W70B3{BHG&shJel z35mDzKK(t<19{(@;oxcn0OS*STT1HZLbAn7JxQg#?FrBG4o?*e{XUIYdu`AI)<&mm z2>S~#opY7T_`nC^cOdLQbWDJSl$nn+hyWTVmBUCRGA=TyhA(_F&m=QVOqXo7Xtdt2 z$hg*+;Y*o|1^w??sl5mNeqxLMs=6U87x> zCv|w*HA;F8&aP1sSvgAjC2C;jd$Hw~czCs2*FqE*Jd@LytNMB!u6`N4PQ~D%F1jvY Kc_IH_z}Gj{Qy>=r literal 0 HcmV?d00001 From 7339d1ee4ad11086d94ce58974ffca92440e09e1 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Fri, 13 Apr 2012 12:10:47 +0800 Subject: [PATCH 4/6] starting Resque --- Gemfile | 2 ++ Gemfile.lock | 18 ++++++++++++++ app/jobs/fetch_time.rb | 11 +++++++++ app/mailer/cron_mail.rb | 8 ++++++ config/environments/development.rb | 22 ++++++++--------- config/initializers/resque.rb | 15 ++++++++++++ config/resque.yml | 2 ++ config/resque_schedule.yml | 6 +++++ config/routes.rb | 1 + lib/tasks/anc_tasks.rake | 1 + lib/tasks/resque.rake | 39 ++++++++++++++++++++++++++++++ 11 files changed, 114 insertions(+), 11 deletions(-) create mode 100644 app/jobs/fetch_time.rb create mode 100644 app/mailer/cron_mail.rb create mode 100644 config/initializers/resque.rb create mode 100644 config/resque.yml create mode 100644 config/resque_schedule.yml create mode 100644 lib/tasks/resque.rake diff --git a/Gemfile b/Gemfile index d1afdb8c..a6b96ff2 100644 --- a/Gemfile +++ b/Gemfile @@ -19,6 +19,8 @@ gem "mongo_session_store-rails3" gem 'nokogiri' gem 'radius' gem 'rake' +gem 'resque-scheduler', :require => 'resque_scheduler' +gem 'resque', :require => "resque/server" gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/Gemfile.lock b/Gemfile.lock index 71742974..80ce363c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -153,6 +153,18 @@ GEM rake (0.9.2.2) rdoc (3.12) json (~> 1.4) + redis (2.2.2) + redis-namespace (1.0.3) + redis (< 3.0.0) + resque (1.20.0) + multi_json (~> 1.0) + redis-namespace (~> 1.0.2) + sinatra (>= 0.9.2) + vegas (~> 0.1.2) + resque-scheduler (1.9.9) + redis (>= 2.0.1) + resque (>= 1.8.0) + rufus-scheduler rspec (2.8.0) rspec-core (~> 2.8.0) rspec-expectations (~> 2.8.0) @@ -182,6 +194,8 @@ GEM ruby_parser (2.3.1) sexp_processor (~> 3.0) rubyzip (0.9.6.1) + rufus-scheduler (2.0.16) + tzinfo (>= 0.3.23) ruport (1.6.3) fastercsv pdf-writer (= 1.1.8) @@ -222,6 +236,8 @@ GEM uglifier (1.2.3) execjs (>= 0.3.0) multi_json (>= 1.0.2) + vegas (0.1.11) + rack (>= 1.0.0) warden (1.1.1) rack (>= 1.0) watchr (0.7) @@ -259,6 +275,8 @@ DEPENDENCIES radius rails (>= 3.1.0, < 3.2.0) rake + resque + resque-scheduler rspec (~> 2.0) rspec-rails (~> 2.0) ruby-debug19 diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb new file mode 100644 index 00000000..70e58b2b --- /dev/null +++ b/app/jobs/fetch_time.rb @@ -0,0 +1,11 @@ +require 'open-uri' +require 'nokogiri' +module FetchTime + @queue = :fetch_time + + def self.perform() + sleep 10 + doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + CronMail.time_check(doc.at('#ct').children.first.text).deliver + end +end diff --git a/app/mailer/cron_mail.rb b/app/mailer/cron_mail.rb new file mode 100644 index 00000000..8a4c9700 --- /dev/null +++ b/app/mailer/cron_mail.rb @@ -0,0 +1,8 @@ +class CronMail < ActionMailer::Base + default :from => "orbit_test@rulingcom.com" + + def time_check(msg) + #attachments["rails.png"] = File.read("#{Rails.root}/public/images/rails.png") + mail(:to => "Matt ", :subject => msg) + end +end \ No newline at end of file diff --git a/config/environments/development.rb b/config/environments/development.rb index 1dbff032..20f4519b 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -29,16 +29,16 @@ Orbit::Application.configure do # :sender_address => %{"notifier" }, # :exception_recipients => %w{chris@rulingcom.com} - # config.action_mailer.delivery_method = :smtp - # config.action_mailer.smtp_settings = { - # :tls => true, - # :enable_starttls_auto => true, - # :address => "smtp.gmail.com", - # :port => '587', - # :domain => "smtp.gmail.com", - # :authentication => "plain", - # :user_name => "redmine@rulingcom.com", - # :password => "rulingredmine" } - + config.action_mailer.delivery_method = :smtp + config.action_mailer.smtp_settings = { + :tls => true, + :enable_starttls_auto => true, + :address => "smtp.gmail.com", + :port => '587', + :domain => "smtp.gmail.com", + :authentication => "plain", + :user_name => "redmine@rulingcom.com", + :password => "rulingredmine" } + end diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb new file mode 100644 index 00000000..69eabc9c --- /dev/null +++ b/config/initializers/resque.rb @@ -0,0 +1,15 @@ +require 'resque_scheduler' +require 'resque_scheduler/server' +require 'yaml' + +rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..' +rails_env = ENV['RAILS_ENV'] || 'development' + +resque_config = YAML.load_file(rails_root + '/config/resque.yml') +Resque.redis = resque_config[rails_env] + +Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml") +Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file } + +# current_path = Rails.root.to_s.gsub(/\s/,'\ ') +# queues = [:test] diff --git a/config/resque.yml b/config/resque.yml new file mode 100644 index 00000000..f874633c --- /dev/null +++ b/config/resque.yml @@ -0,0 +1,2 @@ +development: localhost:6379 +production: localhost:6379 diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml new file mode 100644 index 00000000..08b1b7ea --- /dev/null +++ b/config/resque_schedule.yml @@ -0,0 +1,6 @@ +time_to_talk_a_rest: + cron: "*/5 * * * *" + class: FetchTime + queue: daemons + rails_env: development + description: Send Email for Remind Time diff --git a/config/routes.rb b/config/routes.rb index 1b98bcc2..627738d3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,6 +12,7 @@ Orbit::Application.routes.draw do # routes for admin namespace :admin do + mount Resque::Server.new, :at => "/resque" resources :assets resources :app_auths resources :object_auths do diff --git a/lib/tasks/anc_tasks.rake b/lib/tasks/anc_tasks.rake index cd534b93..a97e1830 100644 --- a/lib/tasks/anc_tasks.rake +++ b/lib/tasks/anc_tasks.rake @@ -1,3 +1,4 @@ +require 'resque_scheduler/tasks' # encoding: utf-8 namespace :anc do diff --git a/lib/tasks/resque.rake b/lib/tasks/resque.rake new file mode 100644 index 00000000..66841c72 --- /dev/null +++ b/lib/tasks/resque.rake @@ -0,0 +1,39 @@ +# require "resque/tasks" +# require 'resque/scheduler' +# require 'resque/scheduler' + +# +# task "resque:setup" => :environment +# Resque tasks +require 'resque/tasks' +require 'resque_scheduler/tasks' + +namespace :resque do + task :setup => :environment do + require 'resque' + require 'resque_scheduler' + require 'resque/scheduler' + + # you probably already have this somewhere + Resque.redis = 'localhost:6379' + + # If you want to be able to dynamically change the schedule, + # uncomment this line. A dynamic schedule can be updated via the + # Resque::Scheduler.set_schedule (and remove_schedule) methods. + # When dynamic is set to true, the scheduler process looks for + # schedule changes and applies them on the fly. + # Note: This feature is only available in >=2.0.0. + #Resque::Scheduler.dynamic = true + + # The schedule doesn't need to be stored in a YAML, it just needs to + # be a hash. YAML is usually the easiest. + Resque.schedule = YAML.load_file('config/resque_schedule.yml') + + # If your schedule already has +queue+ set for each job, you don't + # need to require your jobs. This can be an advantage since it's + # less code that resque-scheduler needs to know about. But in a small + # project, it's usually easier to just include you job classes here. + # So, someting like this: + #require 'jobs' + end +end \ No newline at end of file From 5b604037f80b447908438baeaba43062602423e1 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Mon, 7 May 2012 10:23:16 +0800 Subject: [PATCH 5/6] now jobs is working --- Gemfile | 4 ++-- app/jobs/fetch_time.rb | 14 ++++++++------ config/initializers/resque.rb | 23 ++++++++++++++--------- config/resque.yml | 2 -- config/resque_schedule.yml | 9 ++++----- config/routes.rb | 2 +- 6 files changed, 29 insertions(+), 25 deletions(-) delete mode 100644 config/resque.yml diff --git a/Gemfile b/Gemfile index a6b96ff2..6e6bc39c 100644 --- a/Gemfile +++ b/Gemfile @@ -19,8 +19,8 @@ gem "mongo_session_store-rails3" gem 'nokogiri' gem 'radius' gem 'rake' -gem 'resque-scheduler', :require => 'resque_scheduler' -gem 'resque', :require => "resque/server" +gem 'resque' # background jobs +gem 'resque-scheduler' # job scheduling gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb index 70e58b2b..7758cace 100644 --- a/app/jobs/fetch_time.rb +++ b/app/jobs/fetch_time.rb @@ -1,11 +1,13 @@ -require 'open-uri' -require 'nokogiri' +# require 'open-uri' +# require 'nokogiri' module FetchTime - @queue = :fetch_time + @queue = :my_job_queue def self.perform() - sleep 10 - doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) - CronMail.time_check(doc.at('#ct').children.first.text).deliver +# sleep 10 + # doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + # CronMail.time_check(doc.at('#ct').children.first.text).deliver + # puts "Mail Sent" + # true end end diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb index 69eabc9c..69a535f3 100644 --- a/config/initializers/resque.rb +++ b/config/initializers/resque.rb @@ -1,15 +1,20 @@ require 'resque_scheduler' -require 'resque_scheduler/server' -require 'yaml' +# require 'resque_scheduler/server' +# require 'yaml' -rails_root = ENV['RAILS_ROOT'] || File.dirname(__FILE__) + '/../..' -rails_env = ENV['RAILS_ENV'] || 'development' +Resque.redis = 'localhost:6379' +Resque.redis.namespace = "resque:SchedulerExample" -resque_config = YAML.load_file(rails_root + '/config/resque.yml') -Resque.redis = resque_config[rails_env] +# If you want to be able to dynamically change the schedule, +# uncomment this line. A dynamic schedule can be updated via the +# Resque::Scheduler.set_schedule (and remove_schedule) methods. +# When dynamic is set to true, the scheduler process looks for +# schedule changes and applies them on the fly. +# Note: This feature is only available in >=2.0.0. +#Resque::Scheduler.dynamic = true -Resque.schedule = YAML.load_file("#{Rails.root}/config/resque_schedule.yml") Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file } -# current_path = Rails.root.to_s.gsub(/\s/,'\ ') -# queues = [:test] +# The schedule doesn't need to be stored in a YAML, it just needs to +# be a hash. YAML is usually the easiest. +Resque.schedule = YAML.load_file(Rails.root.join('config', 'resque_schedule.yml')) \ No newline at end of file diff --git a/config/resque.yml b/config/resque.yml deleted file mode 100644 index f874633c..00000000 --- a/config/resque.yml +++ /dev/null @@ -1,2 +0,0 @@ -development: localhost:6379 -production: localhost:6379 diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 08b1b7ea..6c960ede 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -1,6 +1,5 @@ -time_to_talk_a_rest: - cron: "*/5 * * * *" +do_my_job: + every: 30s class: FetchTime - queue: daemons - rails_env: development - description: Send Email for Remind Time + args: + description: Runs the perform method in MyJob diff --git a/config/routes.rb b/config/routes.rb index 627738d3..50600063 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ Orbit::Application.routes.draw do - + mount Resque::Server, :at => "/admin/resque" devise_for :users # routes for sinatra app From d7194dc8053a63f68d06e6033c2013818a151cc3 Mon Sep 17 00:00:00 2001 From: "Matthew K. Fu JuYuan" Date: Tue, 8 May 2012 11:31:35 +0800 Subject: [PATCH 6/6] God , Resque, Resque-schedule, is working,but buggy. Need to combine with LDAP and also implement XML calendar sync. --- Gemfile | 1 + Gemfile.lock | 3 ++ Rakefile | 2 ++ app/jobs/fetch_time.rb | 14 +++++---- app/jobs/nccu_calendar.rb | 8 +++++ app/jobs/sync_db.rb | 9 ++++++ config/application.rb | 2 ++ config/initializers/resque.rb | 2 +- config/resque.god | 55 ++++++++++++++++++++++++++++++++++ config/resque_schedule.yml | 18 +++++++++-- dump.rdb | Bin 0 -> 899 bytes 11 files changed, 104 insertions(+), 10 deletions(-) create mode 100644 app/jobs/nccu_calendar.rb create mode 100644 app/jobs/sync_db.rb create mode 100644 config/resque.god create mode 100644 dump.rdb diff --git a/Gemfile b/Gemfile index 6e6bc39c..d6129092 100644 --- a/Gemfile +++ b/Gemfile @@ -21,6 +21,7 @@ gem 'radius' gem 'rake' gem 'resque' # background jobs gem 'resque-scheduler' # job scheduling +gem 'resque-restriction' gem 'ruby-debug19' gem 'rubyzip' gem 'sinatra' diff --git a/Gemfile.lock b/Gemfile.lock index 80ce363c..16acce21 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -161,6 +161,8 @@ GEM redis-namespace (~> 1.0.2) sinatra (>= 0.9.2) vegas (~> 0.1.2) + resque-restriction (0.3.0) + resque (>= 1.7.0) resque-scheduler (1.9.9) redis (>= 2.0.1) resque (>= 1.8.0) @@ -276,6 +278,7 @@ DEPENDENCIES rails (>= 3.1.0, < 3.2.0) rake resque + resque-restriction resque-scheduler rspec (~> 2.0) rspec-rails (~> 2.0) diff --git a/Rakefile b/Rakefile index 9a495de7..e0dc9c5b 100644 --- a/Rakefile +++ b/Rakefile @@ -1,7 +1,9 @@ +# /usr/bin/ruby -Ku # Add your own tasks in files placed in lib/tasks ending in .rake, # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. require File.expand_path('../config/application', __FILE__) +require 'resque/tasks' require 'rake/dsl_definition' require 'rake' diff --git a/app/jobs/fetch_time.rb b/app/jobs/fetch_time.rb index 7758cace..5fce3036 100644 --- a/app/jobs/fetch_time.rb +++ b/app/jobs/fetch_time.rb @@ -1,13 +1,15 @@ # require 'open-uri' # require 'nokogiri' -module FetchTime - @queue = :my_job_queue +class FetchTime < Resque::Plugins::RestrictionJob + restrict :per_300 => 10 + + @queue = :low def self.perform() # sleep 10 - # doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) - # CronMail.time_check(doc.at('#ct').children.first.text).deliver - # puts "Mail Sent" - # true + doc = Nokogiri::HTML(open('http://www.timeanddate.com/worldclock/city.html?n=241')) + CronMail.time_check(doc.at('#ct').children.first.text).deliver + puts "Mail Sent" + true end end diff --git a/app/jobs/nccu_calendar.rb b/app/jobs/nccu_calendar.rb new file mode 100644 index 00000000..724804d4 --- /dev/null +++ b/app/jobs/nccu_calendar.rb @@ -0,0 +1,8 @@ +class NccuCalendar + @queue = :high + + def self.perform() +# sleep 10 + puts "NccuCalendar Sync" + end +end diff --git a/app/jobs/sync_db.rb b/app/jobs/sync_db.rb new file mode 100644 index 00000000..f6458204 --- /dev/null +++ b/app/jobs/sync_db.rb @@ -0,0 +1,9 @@ +class SyncDb + + @queue = :high + + def self.perform() +# sleep 10 + puts "DB Sync" + end +end diff --git a/config/application.rb b/config/application.rb index cef8c446..8460d136 100644 --- a/config/application.rb +++ b/config/application.rb @@ -62,6 +62,8 @@ module Orbit # Enable the asset pipeline config.assets.enabled = true + #config.time_zone = 'Taipei' + ENV['TZ'] = 'Asia/Taipei' end end Orbit_Apps = [] diff --git a/config/initializers/resque.rb b/config/initializers/resque.rb index 69a535f3..f6f08406 100644 --- a/config/initializers/resque.rb +++ b/config/initializers/resque.rb @@ -3,7 +3,7 @@ require 'resque_scheduler' # require 'yaml' Resque.redis = 'localhost:6379' -Resque.redis.namespace = "resque:SchedulerExample" +#Resque.redis.namespace = "resque:SchedulerExample" # If you want to be able to dynamically change the schedule, # uncomment this line. A dynamic schedule can be updated via the diff --git a/config/resque.god b/config/resque.god new file mode 100644 index 00000000..6c4e4bde --- /dev/null +++ b/config/resque.god @@ -0,0 +1,55 @@ +rails_env = 'development' #ENV['RAILS_ENV'] || "production" +rails_root = ENV['RAILS_ROOT'] || "/Users/kaito/Documents/MyWorkspeace/orbit/orbit" +num_workers = rails_env == 'production' ? 5 : 2 + +num_workers.times do |num| + God.watch do |w| + w.dir = "#{rails_root}" + w.name = "resque-#{num}" + w.group = 'resque' + w.interval = 30.seconds + p "/usr/bin/rake -f #{rails_root}/Rakefile resque:work QUEUE=* RAILS_ENV=#{rails_env}" +# w.env = {"QUEUE"=>"critical,high,low", "RAILS_ENV"=>rails_env} + w.start = "rake -f #{rails_root}/Rakefile resque:work QUEUE=* RAILS_ENV=#{rails_env}" + + w.uid = 'kaito' + w.gid = 'staff' + + # restart if memory gets too high + w.transition(:up, :restart) do |on| + on.condition(:memory_usage) do |c| + c.above = 350.megabytes + c.times = 2 + end + end + + # determine the state on startup + w.transition(:init, { true => :up, false => :start }) do |on| + on.condition(:process_running) do |c| + c.running = true + end + end + + # determine when process has finished starting + w.transition([:start, :restart], :up) do |on| + on.condition(:process_running) do |c| + c.running = true + c.interval = 5.seconds + end + + # failsafe + on.condition(:tries) do |c| + c.times = 5 + c.transition = :start + c.interval = 5.seconds + end + end + + # start if process is not running + w.transition(:up, :start) do |on| + on.condition(:process_running) do |c| + c.running = false + end + end + end +end \ No newline at end of file diff --git a/config/resque_schedule.yml b/config/resque_schedule.yml index 6c960ede..10f97f5f 100644 --- a/config/resque_schedule.yml +++ b/config/resque_schedule.yml @@ -1,5 +1,17 @@ -do_my_job: - every: 30s +do_mail_matt: + every: 10s class: FetchTime args: - description: Runs the perform method in MyJob + description: Runs the perform method in FetchTime + +nccu_daily_ldap_sync: + cron: 30 * * * * * + class: SyncDb + args: + description: Runs the perform method in SnycDB + +nccu_claender_sync: + every: 1m + class: NccuCalendar + args: + description: Runs the perform method in NccuCalendar \ No newline at end of file diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..e5b34fe1d130ce07b54b42b5af7c97f58de85954 GIT binary patch literal 899 zcmaizPfNov7{;@@t0JPHAWn1eFde+<+N{gfP4MEuc@qyYjcc*{W70B3{BHG&shJel z35mDzKK(t<19{(@;oxcn0OS*STT1HZLbAn7JxQg#?FrBG4o?*e{XUIYdu`AI)<&mm z2>S~#opY7T_`nC^cOdLQbWDJSl$nn+hyWTVmBUCRGA=TyhA(_F&m=QVOqXo7Xtdt2 z$hg*+;Y*o|1^w??sl5mNeqxLMs=6U87x> zCv|w*HA;F8&aP1sSvgAjC2C;jd$Hw~czCs2*FqE*Jd@LytNMB!u6`N4PQ~D%F1jvY Kc_IH_z}Gj{Qy>=r literal 0 HcmV?d00001