mxenabled / action_subscriber

Easily subscribe to RabbitMQ messages from your Rails application
MIT License
24 stars 21 forks source link

Circular dependency detected while autoloading #63

Open brianbroderick opened 8 years ago

brianbroderick commented 8 years ago

Error

RuntimeError: Circular dependency detected while autoloading constant 
Transform::TwitterPowertrack

Specs

action_subscriber (2.3.0-java) Rails (4.2.6) Ruby: jruby 9.0.5.0

Directory Structure

Normal Rails, plus:

app
 |-- service_objects
   |-- transform
     |-- twitter_powertrack.rb

Object creation looks like this:

class Transform::TwitterPowertrack < ::ServiceObject
end

Additional Notes

Only thing loaded extra in application.rb is: config.autoload_paths << Rails.root.join("lib")

Procfile

web: bundle exec rails server puma -p $PORT -e $RACK_ENV
worker: bundle exec action_subscriber start --host $RABBITMQ_HOST --port $RABBITMQ_PORT

Runtime

foreman start

Backtrace

/Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:492:in `load_missing_constant'
10:18:21 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:184:in `const_missing'
10:18:21 worker.1 | /projects/pallet_jack/app/subscribers/powertrack_v2_activity_subscriber.rb:5:in `created'
10:18:21 worker.1 | org/jruby/RubyKernel.java:1823:in `public_send'
10:18:21 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/dsl.rb:81:in `block in run_action_with_filters'
10:18:21 worker.1 | org/jruby/RubyProc.java:318:in `call'
10:18:21 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/dsl.rb:86:in `run_action_with_filters'
10:18:21 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/middleware/router.rb:12:in `call'
10:18:21 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/middleware/active_record/query_cache.rb:14:in `call'
10:18:21 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/middleware/active_record/connection_management.rb:10:in `call'
10:18:21 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/middleware/decoder.rb:15:in `call'
10:18:21 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/middleware/error_handler.rb:11:in `call'
10:18:21 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/middleware-0.1.0/lib/middleware/runner.rb:31:in `call'
10:18:21 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/middleware-0.1.0/lib/middleware/builder.rb:102:in `call'
10:18:21 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/march_hare/subscriber.rb:76:in `block in enqueue_env'
10:18:21 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/activesupport-4.2.6/lib/active_support/notifications.rb:166:in `instrument'
10:18:21 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/march_hare/subscriber.rb:75:in `block in enqueue_env'
10:18:21 worker.1 | org/jruby/RubyProc.java:318:in `call'
10:18:21 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/lifeguard-0.0.9/lib/lifeguard/threadpool.rb:75:in `block in async'

Additional Notes

ActionSubscriber hangs about 25% of the time after getting this error.

brianbroderick commented 8 years ago

I also get this error from time to time:

ArgumentError: A copy of Transform has been removed from the module tree but is still active!
/Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:479:in `load_missing_constant'
11:49:40 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/activesupport-4.2.6/lib/active_support/dependencies.rb:184:in `const_missing'
11:49:40 worker.1 | /projects/pallet_jack/app/subscribers/powertrack_v2_activity_subscriber.rb:5:in `created'
11:49:40 worker.1 | org/jruby/RubyKernel.java:1823:in `public_send'
11:49:40 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/dsl.rb:81:in `block in run_action_with_filters'
11:49:40 worker.1 | org/jruby/RubyProc.java:318:in `call'
11:49:40 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/dsl.rb:86:in `run_action_with_filters'
11:49:40 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/middleware/router.rb:12:in `call'
11:49:40 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/middleware/active_record/query_cache.rb:14:in `call'
11:49:40 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/middleware/active_record/connection_management.rb:10:in `call'
11:49:40 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/middleware/decoder.rb:15:in `call'
11:49:40 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/middleware/error_handler.rb:11:in `call'
11:49:40 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/middleware-0.1.0/lib/middleware/runner.rb:31:in `call'
11:49:40 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/middleware-0.1.0/lib/middleware/builder.rb:102:in `call'
11:49:40 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/march_hare/subscriber.rb:76:in `block in enqueue_env'
11:49:40 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/activesupport-4.2.6/lib/active_support/notifications.rb:166:in `instrument'
11:49:40 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/action_subscriber-2.3.0-java/lib/action_subscriber/march_hare/subscriber.rb:75:in `block in enqueue_env'
11:49:40 worker.1 | org/jruby/RubyProc.java:318:in `call'
11:49:40 worker.1 | /Users/brian.broderick/.rvm/gems/jruby-9.0.5.0@pallet-jack/gems/lifeguard-0.0.9/lib/lifeguard/threadpool.rb:75:in `block in async'
11:49:40 worker.1 | I, [2016-04-25T11:49:40.644000 #16033]  INFO -- : FINISHED dd41dd
mmmries commented 8 years ago

@brianbroderick we have also seen this error periodically in the past and haven't ever been able to track down why it happens. Our Rails app is configured to preload in production, so everything should be loaded by the time require "config/environment.rb" returns, but it seems re-load some of the things in a non threadsafe way.

Do you have any hunches on why that might happen?

brianbroderick commented 8 years ago

One thing to note, I've been doing this in development mode. It's a new project and I don't have a production environment set up for it yet. I'll post here if I still get the error in production.

I've been reading through the ActionSubscriber code, but don't have any hunches yet.

brianbroderick commented 8 years ago

Also, I removed the need (for now) to load the lib directory using:

config.autoload_paths << Rails.root.join("lib")

but that didn't help. (I didn't think it would, but wanted to try anyway)

mmmries commented 8 years ago

Interesting. Thanks for looking into this and sharing your findings. I'll see if I can find a chance to read through some of the more recent docs on Rails. Maybe there is a step with loading it that we are missing. I might also try to read sidekiq since we are very similar to that project in terms of having our own process that loads the rails environment.