Apologies for using an old topic but it has some useful context and examples.
Can anyone offer advice on queuing a series of non-recurring jobs in a plugin?
I don’t want them to repeat or run at regular intervals, I just want them to process asynchronously from my control logic.
I’m using @angus’ excellent Custom Wizard Plugin to capture some information and then my plugin needs to create up to 77 topics.
Attempting to run this synchronously causes a timeout after 31 secs as the whole job probably needs >100 seconds to complete. This means that the job doesn’t finish and control is never passed back to the Wizard plugin.
What I’d like to do is queue the jobs that will create the topics in the background and then hand control back to the plugin for the topics to be created at Sidekiq’s will.
This code extract from above…
after_initialize do
class ::Jobs::ExampleJob < Jobs::Scheduled
every 30.seconds
def execute(args)
puts "THIS IS A TEST"
end
end
end
…shows me how to execute a recurring job, but I want to iterate over the topics to create and enqueue a job for each. I think I’d like to do something like
topics_to_create.each do |topic_details|
enqueue_onceoff_topic_job( topics_details )
end
What should enqueue_onceoff_topic_job()
look like?
Or would it be best to create one job that is passed the details of the 77 topics? Would that still have timeout issues if it is run in the background?
I’ve seen some Onceoff
jobs in the app/jobs/onceoff
section of the source, but it’s not clear to me how they are kicked off. Do you invoke the inner execute
method? Is that enough to queue the jobs?
Many thanks in advance.