ruby-on-railsjob-schedulingresque

Resque not failing an obviously buggy job


I have the following problem with Resque and Rails 6 (ruby 2.7.2). I am new to this gem and wanted to do some simple testing to see how things are handled, so I created a simple failing job:

class TestJob < ApplicationJob
  @queue = :default

  def self.perform(*args)
    0/0
  end
end

Obviously, when I go to the console and run it, I get the error:

irb(main):001:0> TestJob.perform
Traceback (most recent call last):
        3: from (irb):1
        2: from app/jobs/test_job.rb:5:in `perform'
        1: from app/jobs/test_job.rb:5:in `/'
ZeroDivisionError (divided by 0)

But when I run my worker with the command:

QUEUE=* VVERBOSE=true rake resque:work

And then enqueue my job in rails console, the output I get is:

irb(main):002:0> Resque.enqueue(TestJob)
=> true

And in the resque logs:

** [21:32:57 2020-12-09] 15198: resque-2.0.0: Waiting for default
** [21:33:02 2020-12-09] 15198: Checking default
** [21:33:02 2020-12-09] 15198: Found job on default
** [21:33:02 2020-12-09] 15198: resque-2.0.0: Processing default since 1607545982 [TestJob]
** [21:33:02 2020-12-09] 15198: got: (Job{default} | TestJob | [])
** [21:33:02 2020-12-09] 15198: resque-2.0.0: Forked 15765 at 1607545982
** [21:33:02 2020-12-09] 15765: done: (Job{default} | TestJob | [])

Additionally, in the resque web UI it counts this process as successful. The number of failed jobs stays 0. Furthermore, any puts and raise I put into the perform method are not showing in resque/rails console logs.

I have done a basic resque setup on a fresh rails app following the README on the resque's github page. I did not do anything custom. Obviously I restarted my console and worker after I made changes to the test_job.rb file, so this is not a problem of loading (maybe?). I also tried changing self.perform to perform.


Solution

  • I don't know why, but this is the solution. Rather than running:

    Resque.enqueue(TestJob)
    

    one should run:

    TestJob.perform_later
    

    The thing is, the first way is from the Resque README, and the second one is from the Rails docs. I guess I was fixated on doing this the first way, but it looks like going with the rails conventions is always best.