code4j
code4j

Reputation: 4626

Delay job gem will not works in case the referred object changes its attribute

I am facing a very interesting problem. I have tested the Delay job gem 4 times. I doubt it is the design problem of the gem or a bug. I use command rake jobs:work to create worker to do delayed job.

Once I create a LongTask record, i also make a delayed job which will change the attributeminutes_delayed to 2.

The gem works perfectly if I don't update the attributes. But once I edited the description, the gem will not work properly, which means it will not execute the delayed job, but the related delayed job record will be removed in the database.

Interesting final result: enter image description here

It Seems to reference a object with attribute that is exactly the same, this picture was captured before the running time have gone over. it seems to reference a object with attribute that is exactly the same

This one was captured after all tests have been gone though. You can see the delayed job record for test4 have been removed even this delayed job did't have any effect. enter image description here

terminal results (only 2 jobs are executed)

[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] Starting job worker
[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] LongTask#set_delay_time_without_delay completed after 0.0343
[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] 1 jobs processed at 16.6270 j/s, 0 failed ...
[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] LongTask#set_delay_time_without_delay completed after 0.0105
[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] 1 jobs processed at 51.4774 j/s, 0 failed ...

Code in model:

  def set_delay_time(time)
    self.minutes_delayed = time
    # very important for this, otherwise cannot write the change into the database
    self.save
  end

  handle_asynchronously :set_delay_time, :run_at => Proc.new { 2.minutes.from_now }

Code in controller:

 def create
    @long_task = LongTask.new(params[:long_task])

    respond_to do |format|
      if @long_task.save
        @long_task.set_delay_time(2)

Upvotes: 0

Views: 141

Answers (1)

user229044
user229044

Reputation: 239240

Without seeing your code, it's impossible to tell for sure, but it's likely that both of your delayed jobs are working on serialized copies of your object, rather than reloading them from the database.

Upvotes: 0

Related Questions