Index: vendor/plugins/backgroundrb/server/lib/meta_worker.rb
===================================================================
--- vendor/plugins/backgroundrb/server/lib/meta_worker.rb	(revision 419)
+++ vendor/plugins/backgroundrb/server/lib/meta_worker.rb	(working copy)
@@ -333,7 +333,8 @@
 
     # Check for enqueued tasks and invoke appropriate methods
     def check_for_enqueued_tasks
-      while (task = get_next_task)
+      tasks = get_next_tasks(@thread_pool.size - @thread_pool.work_queue.size)
+      tasks.each {|task|
         if self.respond_to? task.worker_method
           Thread.current[:persistent_job_id] = task[:id]
           Thread.current[:job_key] = task[:job_key]
@@ -342,18 +343,15 @@
         else
           task.release_job
         end
-        # Unless configured to loop on persistent tasks, run only
-        # once, and then break
-        break unless BDRB_CONFIG[:backgroundrb][:persistent_multi]
-      end
+      }
     end
 
     # Get the next enqueued job
-    def get_next_task
+    def get_next_tasks(count=1)
       if worker_key && !worker_key.empty?
-        BdrbJobQueue.find_next(worker_name.to_s,worker_key.to_s)
+        BdrbJobQueue.find_next(worker_name.to_s,worker_key.to_s, count)
       else
-        BdrbJobQueue.find_next(worker_name.to_s)
+        BdrbJobQueue.find_next(worker_name.to_s, nil,count)
       end
     end
 
Index: vendor/plugins/backgroundrb/lib/backgroundrb/bdrb_job_queue.rb
===================================================================
--- vendor/plugins/backgroundrb/lib/backgroundrb/bdrb_job_queue.rb	(revision 419)
+++ vendor/plugins/backgroundrb/lib/backgroundrb/bdrb_job_queue.rb	(working copy)
@@ -2,27 +2,34 @@
 
 class BdrbJobQueue < ActiveRecord::Base
   validates_uniqueness_of :job_key,:scope => [:worker_name,:worker_key]
-  # find next task from the table
-  def self.find_next(worker_name,worker_key = nil)
-    returned_job = nil
+
+  # FInd next N tasks
+  def self.find_next(worker_name, worker_key=nil, count=1)
+    t_jobs = []
     ActiveRecord::Base.verify_active_connections!
     transaction do
       unless worker_key
         #use ruby time stamps for time calculations as db might have different times than what is calculated by ruby/rails
-        t_job = find(:first,:conditions => [" worker_name = ? AND taken = ? AND scheduled_at <= ? ", worker_name, 0, Time.now.utc ],:lock => true)
+        t_jobs = find(:all,:limit=>count,:conditions => [" worker_name = ? AND taken = ? AND scheduled_at <= ? ", worker_name, 0, Time.now.utc ],:lock => true)
       else
-        t_job = find(:first,:conditions => [" worker_name = ? AND taken = ? AND worker_key = ? AND scheduled_at <= ? ", worker_name, 0, worker_key, Time.now.utc ],:lock => true)
+        t_jobs = find(:all,:limit=>count,:conditions => [" worker_name = ? AND taken = ? AND worker_key = ? AND scheduled_at <= ? ", worker_name, 0, worker_key, Time.now.utc ],:lock => true)
       end
-      if t_job
-        t_job.taken = 1
-        t_job.started_at = Time.now.utc
-        t_job.save
-        returned_job = t_job
-      end
+      t_jobs.each{|job|
+        job.taken = 1
+        job.started_at = Time.now.utc
+        job.save
+      }
     end
-    returned_job
+    t_jobs = nil if !t_jobs
+
+    if count == 1 
+      t_jobs.first
+    else
+      t_jobs
+    end
   end
 
+
   #these accessors get around any possible character encoding issues with the database
   def args=(args)
     write_attribute(:args, Base64.b64encode(args))
