1
0
Fork 0
mirror of https://github.com/mperham/sidekiq.git synced 2022-11-09 13:52:34 -05:00

Live code reloading, so hot right now!

This commit is contained in:
Mike Perham 2016-02-01 15:59:20 -08:00
parent 8761a23c20
commit 51347c5d97
7 changed files with 77 additions and 43 deletions

12
Gemfile
View file

@ -1,7 +1,9 @@
source 'https://rubygems.org'
gemspec
gem 'rails', '~> 4.2'
gem 'rails', '5.0.0.beta2'
gem 'rack', '2.0.0.alpha'
gem 'sinatra', github: 'sinatra/sinatra'
gem 'simplecov'
gem 'minitest'
gem 'minitest-utils'
@ -22,7 +24,7 @@ platforms :mri do
gem 'ruby-prof'
end
platforms :jruby do
gem 'jruby-openssl'
gem 'activerecord-jdbcsqlite3-adapter'
end
#platforms :jruby do
#gem 'jruby-openssl'
#gem 'activerecord-jdbcsqlite3-adapter'
#end

View file

@ -29,7 +29,8 @@ module Sidekiq
shutdown: [],
},
dead_max_jobs: 10_000,
dead_timeout_in_seconds: 180 * 24 * 60 * 60 # 6 months
dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
reloader: proc { |&block| block.call },
}
DEFAULT_WORKER_OPTIONS = {

View file

@ -233,6 +233,11 @@ module Sidekiq
end
require 'sidekiq/rails'
require File.expand_path("#{options[:require]}/config/environment.rb")
if ::Rails::VERSION::MAJOR > 4 && ::Rails.env.development?
logger.debug "Enabling Rails 5+ code reloading, so hot!"
Sidekiq.options[:reloader] = Sidekiq::Rails::Reloader.new
end
end
options[:tag] ||= default_tag
else

View file

@ -35,6 +35,7 @@ module Sidekiq
@job = nil
@thread = nil
@strategy = (mgr.options[:fetch] || Sidekiq::BasicFetch).new(mgr.options)
@reloader = Sidekiq.options[:reloader]
end
def terminate(wait=false)
@ -116,33 +117,35 @@ module Sidekiq
jobstr = work.job
queue = work.queue_name
ack = false
begin
job = Sidekiq.load_json(jobstr)
klass = job['class'.freeze].constantize
worker = klass.new
worker.jid = job['jid'.freeze]
stats(worker, job, queue) do
Sidekiq.server_middleware.invoke(worker, job, queue) do
# Only ack if we either attempted to start this job or
# successfully completed it. This prevents us from
# losing jobs if a middleware raises an exception before yielding
ack = true
execute_job(worker, cloned(job['args'.freeze]))
end
end
ack = true
rescue Sidekiq::Shutdown
# Had to force kill this job because it didn't finish
# within the timeout. Don't acknowledge the work since
# we didn't properly finish it.
@reloader.call do
ack = false
rescue Exception => ex
handle_exception(ex, job || { :job => jobstr })
raise
ensure
work.acknowledge if ack
begin
job = Sidekiq.load_json(jobstr)
klass = job['class'.freeze].constantize
worker = klass.new
worker.jid = job['jid'.freeze]
stats(worker, job, queue) do
Sidekiq.server_middleware.invoke(worker, job, queue) do
# Only ack if we either attempted to start this job or
# successfully completed it. This prevents us from
# losing jobs if a middleware raises an exception before yielding
ack = true
execute_job(worker, cloned(job['args'.freeze]))
end
end
ack = true
rescue Sidekiq::Shutdown
# Had to force kill this job because it didn't finish
# within the timeout. Don't acknowledge the work since
# we didn't properly finish it.
ack = false
rescue Exception => ex
handle_exception(ex, job || { :job => jobstr })
raise
ensure
work.acknowledge if ack
end
end
end

View file

@ -34,5 +34,28 @@ module Sidekiq
initializer 'sidekiq' do
Sidekiq.hook_rails!
end
class Reloader
def initialize(app = ::Rails.application)
@app = app
end
def call
ActiveSupport::Dependencies.interlock.running do
begin
ActionDispatch::Reloader.prepare! if do_reload_now = reload_dependencies?
yield
ensure
ActionDispatch::Reloader.cleanup! if do_reload_now
end
end
end
private
def reload_dependencies?
@app.config.reload_classes_only_on_change != true || @app.reloaders.any?(&:updated?)
end
end
end if defined?(::Rails)
end

View file

@ -1,21 +1,21 @@
source 'https://rubygems.org'
gem 'sidekiq', :path => '..'
gem 'rails', '5.0.0.beta2'
gem 'rack', '2.0.0.alpha'
gem 'sinatra', github: 'sinatra/sinatra'
platforms :ruby do
gem 'sqlite3'
gem 'redis-namespace'
end
platforms :jruby do
gem 'jruby-openssl'
gem 'activerecord-jdbcsqlite3-adapter'
end
#platforms :jruby do
#gem 'jruby-openssl'
#gem 'activerecord-jdbcsqlite3-adapter'
#end
gem 'rails'
gem 'sidekiq', :path => '..'
#gem 'ruby-prof'
#de Does not work with jruby or rbx:
#de gem 'pry-byebug'
# sidekiq-web dependencies
gem 'sinatra'

View file

@ -19,8 +19,8 @@ Gem::Specification.new do |gem|
gem.add_dependency 'connection_pool', '~> 2.2', '>= 2.2.0'
gem.add_dependency 'concurrent-ruby', '~> 1.0'
gem.add_development_dependency 'redis-namespace', '~> 1.5', '>= 1.5.2'
gem.add_development_dependency 'sinatra', '~> 1.4', '>= 1.4.6'
gem.add_development_dependency 'sinatra', '>= 1.4.6'
gem.add_development_dependency 'minitest', '~> 5.7', '>= 5.7.0'
gem.add_development_dependency 'rake', '~> 10.0'
gem.add_development_dependency 'rails', '~> 4', '>= 3.2.0'
gem.add_development_dependency 'rails', '>= 3.2.0'
end