kulesa-sidekiq 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. data/.gitignore +6 -0
  2. data/.rvmrc +4 -0
  3. data/COMM-LICENSE +83 -0
  4. data/Changes.md +207 -0
  5. data/Gemfile +12 -0
  6. data/LICENSE +22 -0
  7. data/README.md +61 -0
  8. data/Rakefile +9 -0
  9. data/bin/client +7 -0
  10. data/bin/sidekiq +14 -0
  11. data/bin/sidekiqctl +74 -0
  12. data/config.ru +18 -0
  13. data/examples/chef/cookbooks/sidekiq/README.rdoc +11 -0
  14. data/examples/chef/cookbooks/sidekiq/recipes/default.rb +55 -0
  15. data/examples/chef/cookbooks/sidekiq/templates/default/monitrc.conf.erb +8 -0
  16. data/examples/chef/cookbooks/sidekiq/templates/default/sidekiq.erb +219 -0
  17. data/examples/chef/cookbooks/sidekiq/templates/default/sidekiq.yml.erb +22 -0
  18. data/examples/clockwork.rb +44 -0
  19. data/examples/config.yml +10 -0
  20. data/examples/monitrc.conf +6 -0
  21. data/examples/por.rb +27 -0
  22. data/examples/scheduling.rb +37 -0
  23. data/examples/sinkiq.rb +59 -0
  24. data/examples/web-ui.png +0 -0
  25. data/lib/sidekiq.rb +98 -0
  26. data/lib/sidekiq/capistrano.rb +35 -0
  27. data/lib/sidekiq/cli.rb +214 -0
  28. data/lib/sidekiq/client.rb +72 -0
  29. data/lib/sidekiq/extensions/action_mailer.rb +26 -0
  30. data/lib/sidekiq/extensions/active_record.rb +27 -0
  31. data/lib/sidekiq/extensions/generic_proxy.rb +21 -0
  32. data/lib/sidekiq/fetch.rb +76 -0
  33. data/lib/sidekiq/logging.rb +46 -0
  34. data/lib/sidekiq/manager.rb +163 -0
  35. data/lib/sidekiq/middleware/chain.rb +96 -0
  36. data/lib/sidekiq/middleware/client/unique_jobs.rb +36 -0
  37. data/lib/sidekiq/middleware/server/active_record.rb +13 -0
  38. data/lib/sidekiq/middleware/server/exception_handler.rb +38 -0
  39. data/lib/sidekiq/middleware/server/failure_jobs.rb +25 -0
  40. data/lib/sidekiq/middleware/server/logging.rb +31 -0
  41. data/lib/sidekiq/middleware/server/retry_jobs.rb +69 -0
  42. data/lib/sidekiq/middleware/server/timeout.rb +21 -0
  43. data/lib/sidekiq/middleware/server/unique_jobs.rb +17 -0
  44. data/lib/sidekiq/processor.rb +92 -0
  45. data/lib/sidekiq/rails.rb +21 -0
  46. data/lib/sidekiq/redis_connection.rb +27 -0
  47. data/lib/sidekiq/retry.rb +59 -0
  48. data/lib/sidekiq/testing.rb +44 -0
  49. data/lib/sidekiq/testing/inline.rb +37 -0
  50. data/lib/sidekiq/util.rb +40 -0
  51. data/lib/sidekiq/version.rb +3 -0
  52. data/lib/sidekiq/web.rb +185 -0
  53. data/lib/sidekiq/worker.rb +62 -0
  54. data/lib/sidekiq/yaml_patch.rb +21 -0
  55. data/myapp/.gitignore +15 -0
  56. data/myapp/Capfile +5 -0
  57. data/myapp/Gemfile +19 -0
  58. data/myapp/Rakefile +7 -0
  59. data/myapp/app/controllers/application_controller.rb +3 -0
  60. data/myapp/app/controllers/work_controller.rb +38 -0
  61. data/myapp/app/helpers/application_helper.rb +2 -0
  62. data/myapp/app/mailers/.gitkeep +0 -0
  63. data/myapp/app/mailers/user_mailer.rb +9 -0
  64. data/myapp/app/models/.gitkeep +0 -0
  65. data/myapp/app/models/post.rb +5 -0
  66. data/myapp/app/views/layouts/application.html.erb +14 -0
  67. data/myapp/app/views/user_mailer/greetings.html.erb +3 -0
  68. data/myapp/app/views/work/index.html.erb +1 -0
  69. data/myapp/app/workers/hard_worker.rb +10 -0
  70. data/myapp/config.ru +4 -0
  71. data/myapp/config/application.rb +59 -0
  72. data/myapp/config/boot.rb +6 -0
  73. data/myapp/config/database.yml +25 -0
  74. data/myapp/config/deploy.rb +15 -0
  75. data/myapp/config/environment.rb +5 -0
  76. data/myapp/config/environments/development.rb +38 -0
  77. data/myapp/config/environments/production.rb +67 -0
  78. data/myapp/config/environments/test.rb +37 -0
  79. data/myapp/config/initializers/backtrace_silencers.rb +7 -0
  80. data/myapp/config/initializers/inflections.rb +15 -0
  81. data/myapp/config/initializers/mime_types.rb +5 -0
  82. data/myapp/config/initializers/secret_token.rb +7 -0
  83. data/myapp/config/initializers/session_store.rb +8 -0
  84. data/myapp/config/initializers/sidekiq.rb +6 -0
  85. data/myapp/config/initializers/wrap_parameters.rb +14 -0
  86. data/myapp/config/locales/en.yml +5 -0
  87. data/myapp/config/routes.rb +10 -0
  88. data/myapp/db/migrate/20120123214055_create_posts.rb +10 -0
  89. data/myapp/db/seeds.rb +7 -0
  90. data/myapp/lib/assets/.gitkeep +0 -0
  91. data/myapp/lib/tasks/.gitkeep +0 -0
  92. data/myapp/log/.gitkeep +0 -0
  93. data/myapp/script/rails +6 -0
  94. data/sidekiq.gemspec +27 -0
  95. data/test/config.yml +9 -0
  96. data/test/fake_env.rb +0 -0
  97. data/test/helper.rb +16 -0
  98. data/test/test_cli.rb +168 -0
  99. data/test/test_client.rb +119 -0
  100. data/test/test_extensions.rb +69 -0
  101. data/test/test_manager.rb +51 -0
  102. data/test/test_middleware.rb +92 -0
  103. data/test/test_processor.rb +32 -0
  104. data/test/test_retry.rb +125 -0
  105. data/test/test_stats.rb +68 -0
  106. data/test/test_testing.rb +97 -0
  107. data/test/test_testing_inline.rb +75 -0
  108. data/test/test_web.rb +122 -0
  109. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  110. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  111. data/web/assets/javascripts/application.js +20 -0
  112. data/web/assets/javascripts/vendor/bootstrap.js +12 -0
  113. data/web/assets/javascripts/vendor/bootstrap/bootstrap-alert.js +91 -0
  114. data/web/assets/javascripts/vendor/bootstrap/bootstrap-button.js +98 -0
  115. data/web/assets/javascripts/vendor/bootstrap/bootstrap-carousel.js +154 -0
  116. data/web/assets/javascripts/vendor/bootstrap/bootstrap-collapse.js +136 -0
  117. data/web/assets/javascripts/vendor/bootstrap/bootstrap-dropdown.js +92 -0
  118. data/web/assets/javascripts/vendor/bootstrap/bootstrap-modal.js +210 -0
  119. data/web/assets/javascripts/vendor/bootstrap/bootstrap-popover.js +95 -0
  120. data/web/assets/javascripts/vendor/bootstrap/bootstrap-scrollspy.js +125 -0
  121. data/web/assets/javascripts/vendor/bootstrap/bootstrap-tab.js +130 -0
  122. data/web/assets/javascripts/vendor/bootstrap/bootstrap-tooltip.js +270 -0
  123. data/web/assets/javascripts/vendor/bootstrap/bootstrap-transition.js +51 -0
  124. data/web/assets/javascripts/vendor/bootstrap/bootstrap-typeahead.js +271 -0
  125. data/web/assets/javascripts/vendor/jquery.js +9266 -0
  126. data/web/assets/javascripts/vendor/jquery.timeago.js +148 -0
  127. data/web/assets/stylesheets/application.css +27 -0
  128. data/web/assets/stylesheets/vendor/bootstrap-responsive.css +567 -0
  129. data/web/assets/stylesheets/vendor/bootstrap.css +3365 -0
  130. data/web/views/index.slim +48 -0
  131. data/web/views/layout.slim +26 -0
  132. data/web/views/queue.slim +11 -0
  133. data/web/views/retries.slim +29 -0
  134. data/web/views/retry.slim +52 -0
  135. metadata +371 -0
@@ -0,0 +1,18 @@
1
+ require 'sidekiq'
2
+
3
+ Sidekiq.configure_client do |config|
4
+ config.redis = { :size => 1 }
5
+ end
6
+
7
+ #Sidekiq.redis {|conn| conn.flushdb }
8
+ #10.times do |idx|
9
+ #Sidekiq::Client.push('class' => 'HardWorker', 'args' => ['foo', 0.1, idx])
10
+ #end
11
+
12
+ #Sidekiq.redis { |conn| conn.zadd('retry', Time.now.utc.to_f + 3000, MultiJson.encode({
13
+ #'class' => 'HardWorker', 'args' => ['foo', 0.1, Time.now.to_f],
14
+ #'queue' => 'default', 'error_message' => 'No such method', 'error_class' => 'NoMethodError',
15
+ #'failed_at' => Time.now.utc, 'retry_count' => 0 })) }
16
+
17
+ require 'sidekiq/web'
18
+ run Sidekiq::Web
@@ -0,0 +1,11 @@
1
+ = DESCRIPTION:
2
+
3
+ Sidekiq is a Redis-backed Ruby library for creating background jobs, placing those jobs on multiple queues, and processing them later.
4
+
5
+ = USAGE:
6
+
7
+ add require_recipe "sidekiq" to main/recipes/default.rb
8
+
9
+ = NOTES:
10
+
11
+ I setup a basic size for the Sidekiq workers based on the instance_type, if you need more or less workers please modify the recipe itself.
@@ -0,0 +1,55 @@
1
+ #
2
+ # Cookbook Name:: sidekiq
3
+ # Recipe:: default
4
+ #
5
+ role = node[:instance_role]
6
+ if role == 'solo' || (role == 'util' && node[:name] =~ /sidekiq/)
7
+
8
+ # for now
9
+ worker_count = 1
10
+
11
+ node[:applications].each do |app, data|
12
+ template "/etc/monit.d/sidekiq_#{app}.monitrc" do
13
+ owner 'root'
14
+ group 'root'
15
+ mode 0644
16
+ source "monitrc.conf.erb"
17
+ variables({
18
+ :num_workers => worker_count,
19
+ :app_name => app,
20
+ :rails_env => node[:environment][:framework_env]
21
+ })
22
+ end
23
+
24
+ template "/engineyard/bin/sidekiq" do
25
+ owner 'root'
26
+ group 'root'
27
+ mode 0755
28
+ source "sidekiq.erb"
29
+ end
30
+
31
+ worker_count.times do |count|
32
+ template "/data/#{app}/shared/config/sidekiq_#{count}.yml" do
33
+ owner node[:owner_name]
34
+ group node[:owner_name]
35
+ mode 0644
36
+ source "sidekiq.yml.erb"
37
+ variables({
38
+ :require => "/data/#{app}/current"
39
+ })
40
+ end
41
+ end
42
+
43
+ execute "ensure-sidekiq-is-setup-with-monit" do
44
+ command %Q{
45
+ monit reload
46
+ }
47
+ end
48
+
49
+ execute "restart-sidekiq" do
50
+ command %Q{
51
+ echo "sleep 20 && monit -g #{app}_sidekiq restart all" | at now
52
+ }
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,8 @@
1
+ <% (@num_workers || 1).times do |num| %>
2
+ check process sidekiq_<%= @app_name %>_<%= num %>
3
+ with pidfile /var/run/engineyard/sidekiq/<%= @app_name %>/sidekiq_<%= num %>.pid
4
+ start program = "/engineyard/bin/sidekiq <%= @app_name %> start <%= @rails_env %> sidekiq_<%= num %>.yml" with timeout 90 seconds
5
+ stop program = "/engineyard/bin/sidekiq <%= @app_name %> stop <%= @rails_env %> sidekiq_<%= num %>.yml" with timeout 90 seconds
6
+ if totalmem is greater than 300 MB for 2 cycles then restart # eating up memory?
7
+ group <%= @app_name %>_sidekiq
8
+ <% end %>
@@ -0,0 +1,219 @@
1
+ #!/bin/sh
2
+ #
3
+ # This script starts and stops the Sidekiq daemon
4
+ # This script belongs in /engineyard/bin/sidekiq
5
+ #
6
+
7
+ PATH=/bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH
8
+ CURDIR=`pwd`
9
+
10
+ usage() {
11
+ echo "Usage: $0 <appname> {start|stop|quit} <environment> <conf_file>"
12
+ echo -e "\nstop) is a synonym for quit"
13
+ echo "quit) issues -INT to request the worker to stop"
14
+ echo -e "\nSee http://mperham.github.com/sidekiq/ for more details"
15
+ exit 1
16
+ }
17
+
18
+ rm_lockfile(){
19
+ if [ -e $LOCK_FILE ]; then
20
+ logger -t "monit-sidekiq[$$]" "removing $LOCK_FILE for `cat $LOCK_FILE`"
21
+ rm $LOCK_FILE
22
+ fi
23
+ }
24
+
25
+ exit_cleanly() {
26
+ cd $CURDIR
27
+ logger -t "monit-sidekiq[$$]" "exiting wrapper cleanly with $RESULT"
28
+ exit $RESULT
29
+ }
30
+
31
+ unlock_and_exit_cleanly(){
32
+ rm_lockfile
33
+ exit_cleanly
34
+ }
35
+
36
+ set_pid_from_file(){
37
+ export PID=`cat $PID_FILE`
38
+ }
39
+
40
+ signal_worker() {
41
+ RESULT=0
42
+ if [ -f $PID_FILE ]; then
43
+ set_pid_from_file
44
+ logger -t "monit-sidekiq[$$]" "Issuing kill with -$SIG $PID"
45
+ SLEEP_COUNT=0
46
+ kill -$SIG $PID
47
+ fi
48
+ }
49
+
50
+ signal_worker_fatally(){
51
+ signal_worker()
52
+ if [ -f $PID_FILE ]; then
53
+ if [ -n "$ALLOW_TIMEOUT" ]; then
54
+ while [ -e /proc/$PID ]; do
55
+ sleep .25
56
+ let "SLEEP_COUNT+=1"
57
+ let "REPORT_TIME = $SLEEP_COUNT%4"
58
+ if(( "$SLEEP_COUNT" > $GRACE_TIME )); then
59
+ logger -t "monit-sidekiq[$$]" "Sidekiq worker with pid $PID for $WORKER_REF still running, issuing -TERM"
60
+ kill -15 $PID 2>/dev/null; true
61
+ elif(( $REPORT_TIME == 0 )); then
62
+ let "RUNTIME = $SLEEP_COUNT/4"
63
+ logger -t "monit-sidekiq[$$]" "waiting for $PID to die ( for $RUNTIME seconds now)"
64
+ fi
65
+ done
66
+ fi
67
+ sleep 1
68
+ if [ -d /proc/$PID ];then
69
+ for child in $(ps axo pid,ppid | awk "{ if ( \$2 == $PID ) { print \$1 }}");
70
+ do
71
+ kill -9 $child 2>/dev/null; true
72
+ logger -t "monit-sidekiq[$$]" "Murdering Sidekiq workers child with $child for $WORKER_REF"
73
+ break
74
+ done
75
+ while [ -d /proc/$PID ]; do
76
+ logger -t "monit-sidekiq[$$]" "Murdering Sidekiq worker with $PID for $WORKER_REF"
77
+ kill -9 $PID
78
+ sleep 1
79
+ done
80
+ fi
81
+ logger -t "monit-sidekiq[$$]" "Removing pid file for $PID - $WORKER_REF"
82
+ [ -e "$PID_FILE" -a ! -d /proc/$PID ] && rm -f $PID_FILE
83
+ fi
84
+ }
85
+
86
+ lock(){
87
+ RESULT=0
88
+ if [ -e $LOCK_FILE ]; then
89
+ LAST_LOCK_PID=`cat $LOCK_FILE`
90
+ if [ -n $LAST_LOCK_PID -a -z "`ps axo pid|grep $LAST_LOCK_PID`" -a -f $LOCK_FILE ];then
91
+ sleep 1
92
+ logger -t "monit-sidekiq[$$]" "Removing stale lock file for $WORKER_REF ($LAST_LOCK_PID)"
93
+ rm $LOCK_FILE 2>&1
94
+ else
95
+ logger -t "monit-sidekiq[$$]" "Monit already messing with $WORKER_REF ($LAST_LOCK_PID)"
96
+ RESULT=1
97
+ exit_cleanly
98
+ fi
99
+ fi
100
+ echo $$ > $LOCK_FILE
101
+ }
102
+
103
+ legacy_fix() {
104
+ #In the transition from 0.18.2 to 0.18.3 of ey monit scripts the way
105
+ #the pid file is used to find the process to kill has changed.
106
+ #To avert problems being left behind after an upgrade of this package,
107
+ if [ -f $PID_FILE ]; then
108
+ set_pid_from_file
109
+ if [ -n "`ps axo pid,command|grep $PID|grep 'su -c'`" ];then
110
+ logger -t "monit-sidekiq[$$]" "Monit Scripts have just been upgraded, killing old style workers"
111
+ for child in $(ps axo pid,ppid| awk "{ if ( \$2 == $PID ) { print \$1 }}");
112
+ do
113
+ kill -TERM $child 2> /dev/null
114
+ while [ -e /proc/$child ]; do
115
+ logger -t "monit-sidekiq[$$]" "killing legacy worker: $child"
116
+ [ -e /proc/$child ] && kill -9 $child 2> /dev/null
117
+ sleep 1
118
+ done
119
+ done
120
+ [ -e /proc/$PID ] && kill -9 $PID 2> /dev/null
121
+ rm $PID_FILE
122
+ unlock_exit_cleanly
123
+ fi
124
+ fi
125
+ }
126
+
127
+ if [ $# -lt 4 ]; then usage; fi
128
+
129
+ if [ "`whoami`" != "root" ]; then
130
+ logger -t `basename $0` -s "Must be run as root"
131
+ exit 1
132
+ fi
133
+
134
+ #Baisc Setup of default values
135
+ APP=$1 ; ACTION=$2; RACK_ENV=$3; CONF_FILE=$4;
136
+
137
+ APP_DIR="/data/${APP}"
138
+ APP_ROOT="${APP_DIR}/current"
139
+ APP_SHARED="${APP_DIR}/shared"
140
+ APP_CONFIG="${APP_SHARED}/config"
141
+
142
+ if [ -e "${APP_CONFIG}/${CONF_FILE}" ]; then
143
+ logger -t "sidekiq_${APP}" -s "Good, found a conf file. Proceeding..."
144
+ else
145
+ logger -t "sidekiq_${APP}" -s "/data/${APP}/shared/config/${CONF_FILE} not found for app: ${APP}"
146
+ exit 1
147
+ fi
148
+
149
+ WORKER_REF=`echo $CONF_FILE | sed s/.conf//`
150
+ LOG_FILE="$APP_ROOT/log/$WORKER_REF.log"
151
+ LOCK_FILE="/tmp/$WORKER_REF.monit-lock"
152
+ PID_FILE="/var/run/engineyard/sidekiq/$APP/$WORKER_REF.pid"
153
+ GEMFILE="$APP_ROOT/Gemfile"
154
+ SIDEKIQ="sidekiq"
155
+ if [ -f $GEMFILE ];then
156
+ SIDEKIQ="bundle exec $APP_ROOT/ey_bundler_binstubs/sidekiq"
157
+ fi
158
+
159
+ if [ -d $APP_ROOT ]; then
160
+ USER=$(stat -L -c"%U" $APP_ROOT)
161
+ export HOME="/home/$USER"
162
+
163
+ # Fix for SD-3786 - stop sending in VERBOSE= and VVERBOSE= by default
164
+ if declare -p VERBOSE >/dev/null 2>&1; then export V="VERBOSE=$VERBOSE"; fi
165
+ if declare -p VVERBOSE >/dev/null 2>&1; then export VV="VVERBOSE=$VVERBOSE"; fi
166
+
167
+ # Older versions of sudo need us to call env for the env vars to be set correctly
168
+ COMMAND="/usr/bin/env $V $VV APP_ROOT=${APP_ROOT} RACK_ENV=${RACK_ENV} RAILS_ENV=${RACK_ENV} $SIDEKIQ -e ${RACK_ENV} -C ${APP_CONFIG}/${CONF_FILE}"
169
+
170
+ if [ ! -d /var/run/engineyard/sidekiq/$APP ]; then
171
+ mkdir -p /var/run/engineyard/sidekiq/$APP
172
+ fi
173
+
174
+ # handle the second param, don't start if already existing
175
+
176
+ logger -t "monit-sidekiq[$$]" "${ACTION}ing Sidekiq worker $WORKER_REF"
177
+ case "$ACTION" in
178
+ start)
179
+ lock
180
+ cd $APP_ROOT
181
+ if [ -f $PID_FILE ]; then
182
+ set_pid_from_file
183
+ if [ -d /proc/$PID ]; then
184
+ logger -t "monit-sidekiq[$$]" "Sidekiq worker $WORKER_REF is already running with $PID."
185
+ RESULT=1
186
+ else
187
+ rm -f $PID_FILE
188
+ logger -t "monit-sidekiq[$$]" "Removing stale pid file ($PID_FILE) for pid $PID"
189
+ fi
190
+ fi
191
+ if [ ! -f $PID_FILE ]; then
192
+ sudo -u $USER -H $COMMAND >> $LOG_FILE 2>&1 &
193
+ RESULT=$?
194
+ logger -t "monit-sidekiq[$$]" "Started with pid $! and exit $RESULT"
195
+ echo $! > $PID_FILE
196
+ sleep .1
197
+ fi
198
+ unlock_and_exit_cleanly
199
+ ;;
200
+ stop|quit)
201
+ legacy_fix
202
+ lock
203
+ SIG="INT"
204
+ [ -z "$GRACE_TIME" ] && GRACE_TIME=60
205
+ ALLOW_TIMEOUT=1
206
+ signal_worker
207
+ [ -e "$LOCK_FILE" ] && rm $LOCK_FILE
208
+ unlock_and_exit_cleanly
209
+ ;;
210
+ *)
211
+ usage
212
+ exit_cleanly
213
+ ;;
214
+ esac
215
+ else
216
+ echo "/data/$APP/current doesn't exist."
217
+ usage
218
+ fi
219
+
@@ -0,0 +1,22 @@
1
+ ---
2
+ <% if @verbose %>
3
+ :verbose: <%= @verbose %>
4
+ <% end %>
5
+ <% if @environment %>
6
+ :environment: <%= @environment %>
7
+ <% end %>
8
+ <% if @require %>
9
+ :require: <%= @require %>
10
+ <% end %>
11
+ <% if @pidfile %>
12
+ :pidfile: <%= @pidfile %>
13
+ <% end %>
14
+ <% if @concurrency %>
15
+ :concurrency: <%= @concurrency %>
16
+ <% end %>
17
+ <% if @queues %>
18
+ :queues:
19
+ <% @queues.each do |name, priority| %>
20
+ - [<%= name %>, <%= priority %>]
21
+ <% end %>
22
+ <% end %>
@@ -0,0 +1,44 @@
1
+ # Sidekiq defers scheduling to other, better suited gems.
2
+ # If you want to run a job regularly, here's an example
3
+ # of using the 'clockwork' gem to push jobs to Sidekiq
4
+ # regularly.
5
+
6
+ # require boot & environment for a Rails app
7
+ # require_relative "../config/boot"
8
+ # require_relative "../config/environment"
9
+ require "clockwork"
10
+
11
+ class MyWorker
12
+ include Sidekiq::Worker
13
+
14
+ def perform(count)
15
+ puts "Job ##{count}: Late night, so tired..."
16
+ end
17
+
18
+ def self.late_night_work
19
+ 10.times do |x|
20
+ perform_async(x)
21
+ end
22
+ end
23
+ end
24
+
25
+ class HourlyWorker
26
+ include Sidekiq::Worker
27
+
28
+ def perform
29
+ cleanup_database
30
+ format_hard_drive
31
+ end
32
+ end
33
+
34
+ module Clockwork
35
+ # Kick off a bunch of jobs early in the morning
36
+ every 1.day, 'my_worker.late_night_work', :at => '4:30 am' do
37
+ MyWorker.late_night_work
38
+ end
39
+
40
+ every 1.hour do
41
+ HourlyWorker.perform_async
42
+ end
43
+ end
44
+
@@ -0,0 +1,10 @@
1
+ # Sample configuration file for Sidekiq.
2
+ # Options here can still be overridden by cmd line args.
3
+ # sidekiq -C config.yml
4
+ ---
5
+ :verbose: false
6
+ :concurrency: 25
7
+ :queues:
8
+ - [often, 7]
9
+ - [default, 5]
10
+ - [seldom, 3]
@@ -0,0 +1,6 @@
1
+ check process sidekiq_myapp
2
+ with pidfile /path/to/sidekiq.pid
3
+ start program = "bundle exec sidekiq -C /path/to/sidekiq_conf.yml -P /path/to/sidekiq.pid" with timeout 90 seconds
4
+ stop program = "kill -s INT `cat /path/to/sidekiq.pid`" with timeout 90 seconds
5
+ if totalmem is greater than 200 MB for 2 cycles then restart # eating up memory?
6
+ group myapp_sidekiq
@@ -0,0 +1,27 @@
1
+ require 'sidekiq'
2
+
3
+ # If your client is single-threaded, we just need a single connection in our Redis connection pool
4
+ Sidekiq.configure_client do |config|
5
+ config.redis = { :namespace => 'x', :size => 1, :url => 'redis://redis.host:1234/14' }
6
+ end
7
+
8
+ # Sidekiq server is multi-threaded so our Redis connection pool size defaults to concurrency (-c)
9
+ Sidekiq.configure_server do |config|
10
+ config.redis = { :namespace => 'x', :url => 'redis://redis.host:1234/14' }
11
+ end
12
+
13
+ # Start up sidekiq via
14
+ # ./bin/sidekiq -r ./examples/por.rb
15
+ # and then you can open up an IRB session like so:
16
+ # irb -r ./examples/por.rb
17
+ # where you can then say
18
+ # PlainOldRuby.perform_async "like a dog", 3
19
+ #
20
+ class PlainOldRuby
21
+ include Sidekiq::Worker
22
+
23
+ def perform(how_hard="super hard", how_long=1)
24
+ sleep how_long
25
+ puts "Workin' #{how_hard}"
26
+ end
27
+ end
@@ -0,0 +1,37 @@
1
+ # Sidekiq defers scheduling to other, better suited gems.
2
+ # If you want to run a job regularly, here's an example
3
+ # of using the 'whenever' gem to push jobs to Sidekiq
4
+ # regularly.
5
+
6
+ class MyWorker
7
+ include Sidekiq::Worker
8
+
9
+ def perform(count)
10
+ puts "Job ##{count}: Late night, so tired..."
11
+ end
12
+
13
+ def self.late_night_work
14
+ 10.times do |x|
15
+ perform_async(x)
16
+ end
17
+ end
18
+ end
19
+
20
+ # Kick off a bunch of jobs early in the morning
21
+ every 1.day, :at => '4:30 am' do
22
+ runner "MyWorker.late_night_work"
23
+ end
24
+
25
+
26
+ class HourlyWorker
27
+ include Sidekiq::Worker
28
+
29
+ def perform
30
+ cleanup_database
31
+ format_hard_drive
32
+ end
33
+ end
34
+
35
+ every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
36
+ runner "HourlyWorker.perform_async"
37
+ end