Search code examples
ruby-on-railspersistencequeuebackgroundrb

Rails backgroundRB plugin need to schedule it and queue to database for persistancy


I'm trying to do the following:

  1. Run a Worker and a method within it every 15 minutes
  2. Have a log of the job last runtime, in the database table bdrd_job_queue.

What I've done:

I have a schedule every 15 minutes in my backgroundRB.yml file

The method call has a persistent_job.finish! call, but it's not working, because the persistent_job object is nil.

How can I ensure it's logged in the DB, but still automatically scheduled from backgroundRB.yml?


Solution

  • I was finally able to do it.

    The workaround is to schedule a task that will queue it to the database, scheduled to run right away.

    In your worker ...

    class NotificationWorker < BackgrounDRb::MetaWorker
      set_worker_name :notification_worker
    
      def create(args = nil)
      end
    
      def queue_notify_changes(args = nil)
        BdrbJobQueue.insert_job(:worker_name => 'notification_worker',
                                :worker_method => 'notify_new_changes_DAEMON',
                                :args => 'hello_world',
                                :scheduled_at => Time.now.utc,
                                :job_key => 'email_changes_notification_task')
      end
      def notify_new_changes_DAEMON
         #Do Incredibly cool stuff here
      end
    

    In the config file backgroundrb.yml

    --- 
    :backgroundrb: 
      :ip: 0.0.0.0
      :port: 11006
      :environment: production
      :log: foreground
      :debug_log: true
      :persistent_disabled: false
      :persistent_delay: 10
    
    :schedules:
      :notification_worker:
        :queue_notify_changes:
          :trigger_args: 0 0 0 * * *