Forum: Italian Ruby user group resque and namespaces

3d7e4f68a3adf938b7c185a4c0fcf5e6?d=identicon&s=25 Guido S. (guidos)
on 2014-04-27 20:54
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

http://stderr.timfischbach.de/2013/09/14/rails-4-a...

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
Fe88efa62f2b20bdeb8689626d375f1e?d=identicon&s=25 Andrea Campolonghi (andreacfm)
on 2014-04-30 11:32
(Received via mailing list)
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 Campolonghi
Ba5ff91885d3b2243fa77b69893b5374?d=identicon&s=25 bugant (Guest)
on 2014-04-30 18:12
(Received via mailing list)
Ciao,

On Sun, Apr 27, 2014 at 8:54 PM, Guido S. <zendar79@gmail.com> 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.
3d7e4f68a3adf938b7c185a4c0fcf5e6?d=identicon&s=25 Guido S. (guidos)
on 2014-05-07 23:42
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:

https://github.com/resque/resque-scheduler/issues/369

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!
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.