Domanda

Includo questo semplice Rack Middleware in un'applicazione Rails:

class Hello

  def initialize(app)
    @app = app
  end

  def call(env)
    [200, {"Content-Type" => "text/html"}, "Hello"]
  end

end

Collegalo all'interno di Environment.rb:

...
Dir.glob("#{RAILS_ROOT}/lib/rack_middleware/*.rb").each do |file|
  require file
end
Rails::Initializer.run do |config|
  config.middleware.use Hello
...

Utilizzo Rails 2.3.5, Webrick 1.3.1, Ruby 1.8.7

Quando l'applicazione viene avviata in modalità di produzione, tutto funziona come previsto: ogni richiesta viene intercettata dal middleware Hello e viene restituito "Hello".Tuttavia, quando eseguita in modalità di sviluppo, la prima richiesta funziona restituendo "Hello", ma la richiesta successiva si blocca.

L'interruzione di webrick mentre è nello stato sospeso produce quanto segue:

^C[2010-03-24 14:31:39] INFO  going to shutdown ...
deadlock 0xb6efbbc0: sleep:-  - /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/reloader.rb:31
deadlock 0xb7d1b1b0: sleep:J(0xb6efbbc0) (main) - /usr/lib/ruby/1.8/webrick/server.rb:113
Exiting
/usr/lib/ruby/1.8/webrick/server.rb:113:in `join': Thread(0xb7d1b1b0): deadlock (fatal)
 from /usr/lib/ruby/1.8/webrick/server.rb:113:in `start'
 from /usr/lib/ruby/1.8/webrick/server.rb:113:in `each'
 from /usr/lib/ruby/1.8/webrick/server.rb:113:in `start'
 from /usr/lib/ruby/1.8/webrick/server.rb:23:in `start'
 from /usr/lib/ruby/1.8/webrick/server.rb:82:in `start'
 from /usr/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/handler/webrick.rb:14:in `run'
 from /usr/lib/ruby/gems/1.8/gems/rails-2.3.5/lib/commands/server.rb:111
 from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
 from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
 from script/server:3

Qualcosa a che fare con il ricaricatore di classi in modalità sviluppo.Nell'eccezione viene menzionata anche la situazione di stallo.

Qualche idea su cosa potrebbe causare questo?Qualche consiglio sull'approccio migliore per eseguire il debug di questo?

AGGIORNAMENTO

$ script/console 
Loading development environment (Rails 2.3.5)
>> app.get '/'
=> 200
>> app.get '/'
ThreadError: stopping only thread
 note: use sleep to stop forever
 from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/reloader.rb:31:in `lock'
 from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/reloader.rb:31:in `run'
 from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/dispatcher.rb:108:in `call'
 from /usr/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/lint.rb:47:in `_call'
 from /usr/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/lint.rb:35:in `call'
 from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/integration.rb:316:in `process'
 from /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/integration.rb:197:in `get'
 from (irb):2

Sembra che potrebbe essere correlato a questo problema:

https://rails.lighthouseapp.com/projects/8994/tickets/3153-actioncontrollerintegrationsession-broken-in-234

È stato utile?

Soluzione

Ho escogitato un trucco che mi conquisterà per il momento.È sul biglietto menzionato sopra.

https://rails.lighthouseapp.com/projects/8994/tickets/3153-actioncontrollerintegrationsession-broken-in-234

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top