4

I'm trying to use pools in a project of mine that uses Celluloid. However, whenever I invoke the pool method on a class which includes Celluloid (thus receiving methods from Celluloid::ClassMethods) I consistently get the error:

NoMethodError: undefined method `services' for Celluloid:Module
     router at /Users/my_username/.rvm/gems/jruby-9.0.5.0/gems/celluloid-supervision-0.20.6/lib/celluloid/supervision/deprecate/supervise.rb:54
  supervise at /Users/my_username/.rvm/gems/jruby-9.0.5.0/gems/celluloid-supervision-0.20.6/lib/celluloid/supervision/deprecate/supervise.rb:6
       pool at /Users/my_username/.rvm/gems/jruby-9.0.5.0/gems/celluloid-pool-0.20.5/lib/celluloid/supervision/container/behavior/pool.rb:13
      <top> at celluloid_pool_test.rb:14

Specifically, this part seems to be the problem:

NoMethodError: undefined method `services' for Celluloid:Module

It tells me that the offending line is /Users/my_username/.rvm/gems/jruby-9.0.5.0/gems/celluloid-supervision-0.20.6/lib/celluloid/supervision/deprecate/supervise.rb:54. It turns out that line holds the code for the Celluloid::Supervision.router method:

def router(*_args)
  # TODO: Actually route, based on :branch, if present; or else:
  Celluloid.services ### this line is what causes the error
end

To make sure that the issue wasn't with my particular project, I grabbed a code sample from this article which utilizes pools and tried to run it:

require 'celluloid'
require 'mathn'

class PrimeWorker
  include Celluloid

  def prime(number)
    if number.prime?
      puts number
    end
  end  
end

pool = PrimeWorker.pool

(2..1000).to_a.map do |i|
  pool.prime! i
end

sleep 100

It failed with the exact same error as my project:

Finally, I ran a dead simple piece of code in IRB to see if pool is what triggers the error about services:

class Foo
  include Celluloid
end
Foo.pool

Sure enough, I got the exact same error. It seems that there is a bug in Celluloid or that I'm not loading a dependency properly. However, I did require 'celluloid/supervision' in my attempts at solving this, to no avail. Am I doing something wrong on my end or is this a bug in Celluloid?

GDP2
  • 1,948
  • 2
  • 22
  • 38

1 Answers1

4

It seems that others have run into this issue before: https://github.com/celluloid/celluloid-pool/issues/10. I guess it has something to do with Celluloid.services being deprecated and not working in newer versions of Celluloid, so using require 'celluloid/current' rather than just require 'celluloid' seems to do the trick.

GDP2
  • 1,948
  • 2
  • 22
  • 38