Resque and namespaces

Ciao lista,

sto usando le seguenti gemme:

  • resque (1.25.2)
  • resque-scheduler (2.5.5)

e sto provando ad specificare un namespace in un’applicazione rails 4.
Ho configurato il config.ru seguendo le indicazioni presenti in questo
post

in modo da proteggere la parte resque-web utilizzando Devise.

Il file .Rakefile è il seguente:

require File.expand_path(‘…/config/application’, FILE)

MyApp::Application.load_tasks
require ‘resque/tasks’
require ‘resque_scheduler/tasks’

task ‘resque:setup’ => :environment do
ENV[‘QUEUE’] ||= ‘*’
ENV[‘RESQUE_NAMESPACE’] ||= ‘resque:MyApp’
Resque.before_fork = Proc.new {
ActiveRecord::Base.establish_connection }
Resque.redis.namespace = ENV[‘RESQUE_NAMESPACE’]
end

namespace :resque do
task :setup do
require ‘resque’
require ‘resque-scheduler’

# you probably already have this somewhere
ENV['OPENREDIS_URL'] ||= 'redis://127.0.0.1:6379'
uri = URI.parse(ENV['OPENREDIS_URL'])
Resque.redis = Redis.new(:host => uri.host, :port => uri.port,

:password => uri.password)
Resque::Scheduler.configure do |c|
c.verbose = true
c.logfile = nil # meaning all messages go to $stdout
c.logformat = ‘text’
c.dynamic = true
end
Resque.logger.formatter = Resque::VeryVerboseFormatter.new
Resque.redis = ‘localhost:6379’

require 'workable'

end
end

e avvio lo scheduler con

rake resque:scheduler --trace

e i worker con

COUNT=2 rake resque:workers --trace

vedo lo scheduler girare correttamente ed alimentare la coda e i worker
scodare i job ed elaborarli

eppure via web non vedo niente sotto il tab scheduler e sotto quello
scheduler.

Ho provato a passare nel config.ru il namespace cosi:

/config.ru

This file is used by Rack-based servers to start the application.

require ::File.expand_path(‘…/config/environment’, FILE)

require ‘resque/server’
require ‘resque_scheduler/server’

map ‘/’ do
run Rails.application
end

map ‘/resque’ do
#This is the important line
use RailsEnvConfigMiddleware

use ActionDispatch::Session::CookieStore, :key =>
MyApp::Application.config.session_options[:key],
:path => ‘/’, :secret => MyApp::Application.config.secret_key_base

use Warden::Manager do |manager|
manager.failure_app = MyApp::Application
manager.default_scope = Devise.default_scope
end

ENV[‘OPENREDIS_URL’] ||= ‘redis://127.0.0.1:6379’
uri = URI.parse(ENV[‘OPENREDIS_URL’])
Resque.redis = Redis.new(:host => uri.host, :port => uri.port,
:password => uri.password)
Rails.logger.info(‘Connected to Redis’)
RESQUE_NAMESPACE = ‘resque:MyApp’
Resque.redis.namespace = RESQUE_NAMESPACE

run AdminResqueServer.new
end

ma non è servito a nulla.

Senza utilizzare namespace invece tutto funziona correttamente.

Qualche suggerimento? Dove sto sbagliando?

Grazie in anticipo

Prova a fare il require di :

require ‘resque_scheduler’
require ‘resque/scheduler’
require ‘resque_scheduler/server’

dopo aver settato il namespace.

Prova a non mettere questo blocco di codice nel resque:setup ma prima in
un file di cui fai require ( tipo un initializer di rails per
intendersi):

 require 'resque_scheduler'
 require 'resque/scheduler'
 require 'resque_scheduler/server'


 # you probably already have this somewhere
 ENV['OPENREDIS_URL'] ||= 'redis://127.0.0.1:6379'
 uri = URI.parse(ENV['OPENREDIS_URL'])
 Resque.redis = Redis.new(:host =>  uri.host, :port =>  uri.port,

:password => uri.password)
Resque::Scheduler.configure do|c|
c.verbose = true
c.logfile = nil # meaning all messages go to $stdout
c.logformat = ‘text’
c.dynamic = true
end
Resque.logger.formatter = Resque::VeryVerboseFormatter.new
Resque.redis = ‘localhost:6379’
QUI SETTI IL NAMESPACE

Andrea

Ho configurato il config.ru seguendo le indicazioni presenti in questo
MyApp::Application.load_tasks

Resque::Scheduler.configure do |c|
end
vedo lo scheduler girare correttamente ed alimentare la coda e i worker

uri = URI.parse(ENV[‘OPENREDIS_URL’])
ma non servito a nulla.

Senza utilizzare namespace invece tutto funziona correttamente.

Qualche suggerimento? Dove sto sbagliando?

Grazie in anticipo


Andrea C.

Ciao,

On Sun, Apr 27, 2014 at 8:54 PM, Guido S. [email protected] wrote:

ENV[‘RESQUE_NAMESPACE’] ||= ‘resque:MyApp’
# you probably already have this somewhere
Resque.logger.formatter = Resque::VeryVerboseFormatter.new
Resque.redis = ‘localhost:6379’

require 'workable'

end
end

Stai definendo due volte il rake task resque:setup.
Prova a farlo una volta solo con tutte le config che ti servono.

ciao ciao,
matteo.

Ciao,

ho refattorizzato tutta la parte di config in un initializer ed
eliminata la doppia definizione di resque:setup.

A questo punto le cose funzionavano a metà: lo scheduler non si
accorgeva della variazione dinamica.

Googlando un po’ mi sono imbattattuto in questa issue:

che fondamentalmente evidenzia il problema che i task lanciati via rake
non “sentono” il settaggio di

Resque::Scheduler.dynamic = true

ho modificato il mio task aggiungendo

ENV[‘DYNAMIC_SCHEDULE’] ||= ‘true’

così:

namespace :resque do
task :setup => :environment do

ENV[‘DYNAMIC_SCHEDULE’] ||= ‘true’

end
end

ed effettivamente ora funziona.

Grazie per le dritte!