mongodb-scheduler 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ced35defa4e08f8f85d1acebd1c1f540cde5fd78bf8ab705413b7c21a6b834c8
4
- data.tar.gz: 75bac1efddceae22c188238636f8dc4c736c42da4a6b7b3e97ec2c49488eb6c7
3
+ metadata.gz: c7f349aeb19c7cbbdff5bb250f0195abd020ff0bd46f547b2d50bf6442f29f5f
4
+ data.tar.gz: 473214d4f4ecaef4b870f66c158cd97e34e377b91da68f6bfd5b3389218352b5
5
5
  SHA512:
6
- metadata.gz: 12ce7bf3f88c5fa3ad1ff05525e1f8e0343c8b0e19ed78dbbe2d4c20ba82d20e6ab1d7c79379f25006a509b47cb29891470b0cde0c6b25e57fa0a93a243a00cd
7
- data.tar.gz: f737ca2752308ee94af20dea9815e991cef3784c723b2e269066d11f7e631fa65e00264900771bfe080c5a800f26fb0b972d4f30b038f8e150ff8d455fec8140
6
+ metadata.gz: 21a71236aefaccb4793cd4ecc385cf7954bfc97aa5fe4d76aa19f6b89dfcea36e55d5473c005e56f0946992f0da9f3fb136e98eb59752701c326634fd1308206
7
+ data.tar.gz: ab0bdd5c15d10c4a0cad8b74202db1bc6c51c2c3f1e720d209406f324a55f3d4955d7ab64efab30ed89fece06e592b041adedec23c0811a986d3f0ec8faf5587
@@ -52,13 +52,14 @@ module Scheduler
52
52
  begin
53
53
  # Counts jobs to schedule.
54
54
  running_jobs = @job_class.running.entries
55
- schedulable_jobs = @job_class.queued.order_by(scheduled_at: :asc).entries
55
+ scheduled_jobs = @job_class.queued.order_by(scheduled_at: :asc).entries
56
+ performable_jobs = scheduled_jobs.select { |job| job.run_at <= Time.now }
56
57
  jobs_to_schedule = @max_concurrent_jobs - running_jobs.count
57
58
  jobs_to_schedule = 0 if jobs_to_schedule < 0
58
59
 
59
60
  # Finds out scheduled jobs waiting to be performed.
60
- scheduled_jobs = []
61
- schedulable_jobs.first(jobs_to_schedule).each do |job|
61
+ performed_jobs = []
62
+ performable_jobs.first(jobs_to_schedule).each do |job|
62
63
  job_pid = Process.fork do
63
64
  begin
64
65
  job.perform(Process.pid)
@@ -68,20 +69,21 @@ module Scheduler
68
69
  end
69
70
  end
70
71
  Process.detach(job_pid)
71
- scheduled_jobs << job
72
+ performed_jobs << job
72
73
  @queue << job.id.to_s
73
74
  end
74
75
 
75
76
  # Logs launched jobs
76
- if scheduled_jobs.any?
77
- @logger.info Rainbow("[Scheduler:#{@pid}] Launched #{scheduled_jobs.count} "\
78
- "jobs: #{scheduled_jobs.map(&:id).map(&:to_s).join(', ')}.").cyan
77
+ if performed_jobs.any?
78
+ @logger.info Rainbow("[Scheduler:#{@pid}] Launched #{performed_jobs.count} "\
79
+ "jobs: #{performed_jobs.map(&:id).map(&:to_s).join(', ')}.").cyan
79
80
  else
80
- if schedulable_jobs.count == 0
81
- @logger.info Rainbow("[Scheduler:#{@pid}] No jobs in queue.").cyan
81
+ if performable_jobs.count == 0
82
+ @logger.info Rainbow("[Scheduler:#{@pid}] No jobs launched, "\
83
+ "#{scheduled_jobs.count} in queue waiting to be performed.").cyan
82
84
  else
83
85
  @logger.warn Rainbow("[Scheduler:#{@pid}] No jobs launched, reached maximum "\
84
- "number of concurrent jobs. Jobs in queue: #{schedulable_jobs.count}.").yellow
86
+ "number of concurrent jobs. Jobs in queue: #{performable_jobs.count}.").yellow
85
87
  end
86
88
  end
87
89
 
@@ -9,12 +9,36 @@ module Scheduler
9
9
  # Possible log levels.
10
10
  LOG_LEVELS = [ :debug, :info, :warn, :error ]
11
11
 
12
+ ##
13
+ # A class to delay jobs.
14
+ class Delayed
15
+
16
+ ##
17
+ # New delayed job.
18
+ def initialize(job_class, time)
19
+ @job_class = job_class
20
+ @time = time
21
+ end
22
+
23
+ ##
24
+ # Creates an instance of this class and schedules the job.
25
+ #
26
+ # @param [String] executable_class the class of the job to run.
27
+ # @param [Array] *job_args job arguments
28
+ #
29
+ # @return [Object] the created job.
30
+ def schedule(executable_class, *job_args)
31
+ @job_class.create(executable_class: executable_class, args: job_args, run_at: Time.now + @time).schedule
32
+ end
33
+ end
34
+
12
35
  def self.included(base)
13
36
  base.class_eval do
14
37
  include Mongoid::Document
15
38
 
16
39
  field :executable_class, type: String
17
40
  field :args, type: Array, default: []
41
+ field :run_at, type: DateTime, default: Time.now
18
42
  field :scheduled_at, type: DateTime
19
43
  field :executed_at, type: DateTime
20
44
  field :completed_at, type: DateTime
@@ -76,6 +100,16 @@ module Scheduler
76
100
  self.create(executable_class: executable_class, args: job_args).schedule
77
101
  end
78
102
 
103
+ ##
104
+ # Creates an instance of this class and schedules the job after the amount of given time.
105
+ #
106
+ # @param [Integer] time the amount of time to wait.
107
+ #
108
+ # @return [Object] the created job.
109
+ def in(time)
110
+ Scheduler::Schedulable::Delayed.new(self, time)
111
+ end
112
+
79
113
  ##
80
114
  # Creates an instance of this class and performs the job.
81
115
  #
@@ -1,3 +1,3 @@
1
1
  module Scheduler
2
- VERSION = "1.1.2"
2
+ VERSION = "1.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongodb-scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Francesco Ballardin
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-01 00:00:00.000000000 Z
11
+ date: 2019-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mongoid