guard / listen

The Listen gem listens to file modifications and notifies you about the changes.
https://rubygems.org/gems/listen
MIT License
1.92k stars 246 forks source link

Managing listener lifecycle #570

Open christopher-b opened 1 year ago

christopher-b commented 1 year ago

Hi Folks, I have a class that includes a listener as a rails "class attribute":

module MyModule
  class MyClass
    cattr_accessor(:file_listener)

    def initialize
      initialize_file_listener
    end

    def initialize_file_listener
      self.file_listener&.stop

      self.file_listener = Listen.to(config[:local_path]) do |modified, added, _|
        # ...
      end

      self.file_listener.start
    end
  end
end

I periodically get this exception when calling start:

ArgumentError: Listen::Listener can't change state from 'stopped' to 'processing_events', only to: backend_started

I'm not sure why this is happening. I believe I'm setting the file_listener variable to a new Listener instance, so the state of that instance should be the default state, :initializing.

Unfortunately, there's nothing in my logs to shed light on this (I have set LISTEN_GEM_DEBUGGING=debug).

Is there additional lifecycle management I need to do on the listeners? Is there a better approach to be taking?

Thanks!

ColinDKelley commented 5 months ago

@christopher-b One approach you could use would be to nil out the file listener once you stop it. That's reasonable since it won't be useful after that point. Then you'd need to create a new one when needed.