Class: Procrastinator::Environment

Inherits:
Object
  • Object
show all
Defined in:
lib/procrastinator/environment.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(persister) ⇒ Environment

Returns a new instance of Environment.

Raises:

  • (ArgumentError)


5
6
7
8
9
10
11
12
13
14
15
# File 'lib/procrastinator/environment.rb', line 5

def initialize(persister)
   raise ArgumentError.new('persister cannot be nil') if persister.nil?

   [:read_tasks, :create_task, :update_task, :delete_task].each do |method|
      raise MalformedPersisterError.new("persister must repond to ##{method}") unless persister.respond_to? method
   end

   @persister = persister
   @queues    = {}
   @processes = []
end

Instance Attribute Details

#persisterObject (readonly)

Returns the value of attribute persister.



3
4
5
# File 'lib/procrastinator/environment.rb', line 3

def persister
  @persister
end

#processesObject (readonly)

Returns the value of attribute processes.



3
4
5
# File 'lib/procrastinator/environment.rb', line 3

def processes
  @processes
end

#queuesObject (readonly)

Returns the value of attribute queues.



3
4
5
# File 'lib/procrastinator/environment.rb', line 3

def queues
  @queues
end

Instance Method Details

#define_queue(name, properties = {}) ⇒ Object

Raises:

  • (ArgumentError)


17
18
19
20
21
# File 'lib/procrastinator/environment.rb', line 17

def define_queue(name, properties={})
   raise ArgumentError.new('queue name cannot be nil') if name.nil?

   @queues[name] = properties
end

#delay(queue: nil, run_at: Time.now.to_i, expire_at: nil, task:) ⇒ Object

Raises:

  • (ArgumentError)


40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/procrastinator/environment.rb', line 40

def delay(queue: nil, run_at: Time.now.to_i, expire_at: nil, task:)
   raise ArgumentError.new('task may not be nil') if task.nil?
   raise MalformedTaskError.new('given task does not support #run method') unless task.respond_to? :run
   if queue.nil? && @queues.size > 1
      raise ArgumentError.new('queue must be specified when more than one is registered')
   else
      queue ||= @queues.keys.first
      raise ArgumentError.new(%Q{there is no "#{queue}" queue registered in this environment}) if @queues[queue].nil?
   end

   @persister.create_task(queue:          queue,
                          run_at:         run_at.to_i,
                          initial_run_at: run_at.to_i,
                          expire_at:      expire_at.nil? ? nil : expire_at.to_i,
                          task:           YAML.dump(task))
end

#spawn_workersObject



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/procrastinator/environment.rb', line 23

def spawn_workers
   @queues.each do |name, props|
      pid = fork do
         Process.setproctitle("#{name}-queue-worker")

         worker = QueueWorker.new(props.merge(name: name, persister: @persister))

         monitor_parent

         worker.work
      end

      Process.detach(pid) unless pid.nil?
      @processes << pid
   end
end