solid_queue 0.3.0 → 0.3.1

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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -10
  3. data/app/models/solid_queue/blocked_execution.rb +16 -10
  4. data/app/models/solid_queue/claimed_execution.rb +11 -4
  5. data/app/models/solid_queue/execution/dispatching.rb +2 -3
  6. data/app/models/solid_queue/execution.rb +32 -15
  7. data/app/models/solid_queue/failed_execution.rb +10 -6
  8. data/app/models/solid_queue/job/executable.rb +1 -1
  9. data/app/models/solid_queue/job/schedulable.rb +1 -1
  10. data/app/models/solid_queue/process/prunable.rb +6 -5
  11. data/app/models/solid_queue/process.rb +13 -6
  12. data/app/models/solid_queue/recurring_execution.rb +3 -3
  13. data/app/models/solid_queue/scheduled_execution.rb +3 -1
  14. data/app/models/solid_queue/semaphore.rb +1 -1
  15. data/lib/active_job/queue_adapters/solid_queue_adapter.rb +4 -0
  16. data/lib/generators/solid_queue/install/templates/config.yml +1 -1
  17. data/lib/puma/plugin/solid_queue.rb +1 -0
  18. data/lib/solid_queue/app_executor.rb +1 -1
  19. data/lib/solid_queue/dispatcher/recurring_task.rb +13 -7
  20. data/lib/solid_queue/dispatcher.rb +4 -4
  21. data/lib/solid_queue/engine.rb +4 -2
  22. data/lib/solid_queue/log_subscriber.rb +164 -0
  23. data/lib/solid_queue/processes/base.rb +16 -0
  24. data/lib/solid_queue/processes/interruptible.rb +1 -1
  25. data/lib/solid_queue/processes/poller.rb +7 -5
  26. data/lib/solid_queue/processes/registrable.rb +5 -23
  27. data/lib/solid_queue/processes/runnable.rb +4 -3
  28. data/lib/solid_queue/processes/signals.rb +1 -1
  29. data/lib/solid_queue/supervisor.rb +25 -24
  30. data/lib/solid_queue/version.rb +1 -1
  31. data/lib/solid_queue/worker.rb +6 -6
  32. data/lib/solid_queue.rb +19 -10
  33. metadata +23 -11
  34. data/lib/solid_queue/recurring_tasks/manager.rb +0 -31
  35. data/lib/solid_queue/recurring_tasks/schedule.rb +0 -58
  36. data/lib/solid_queue/recurring_tasks/task.rb +0 -87
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module SolidQueue
4
- module RecurringTasks
5
- class Schedule
6
- include AppExecutor
7
-
8
- attr_reader :configured_tasks, :scheduled_tasks
9
-
10
- def initialize(tasks)
11
- @configured_tasks = Array(tasks).map { |task| Task.wrap(task) }
12
- @scheduled_tasks = Concurrent::Hash.new
13
- end
14
-
15
- def load_tasks
16
- configured_tasks.each do |task|
17
- load_task(task)
18
- end
19
- end
20
-
21
- def load_task(task)
22
- scheduled_tasks[task.key] = schedule(task)
23
- end
24
-
25
- def unload_tasks
26
- scheduled_tasks.values.each(&:cancel)
27
- scheduled_tasks.clear
28
- end
29
-
30
- def tasks
31
- configured_tasks.each_with_object({}) { |task, hsh| hsh[task.key] = task.to_h }
32
- end
33
-
34
- def inspect
35
- configured_tasks.map(&:to_s).join(" | ")
36
- end
37
-
38
- private
39
- def schedule(task)
40
- scheduled_task = Concurrent::ScheduledTask.new(task.delay_from_now, args: [ self, task, task.next_time ]) do |thread_schedule, thread_task, thread_task_run_at|
41
- thread_schedule.load_task(thread_task)
42
-
43
- wrap_in_app_executor do
44
- thread_task.enqueue(at: thread_task_run_at)
45
- end
46
- end
47
-
48
- scheduled_task.add_observer do |_, _, error|
49
- # Don't notify on task cancellation before execution, as this will happen normally
50
- # as part of unloading tasks
51
- handle_thread_error(error) if error && !error.is_a?(Concurrent::CancelledOperationError)
52
- end
53
-
54
- scheduled_task.tap(&:execute)
55
- end
56
- end
57
- end
58
- end
@@ -1,87 +0,0 @@
1
- require "fugit"
2
-
3
- module SolidQueue
4
- module RecurringTasks
5
- class Task
6
- class << self
7
- def wrap(args)
8
- args.is_a?(self) ? args : from_configuration(args.first, **args.second)
9
- end
10
-
11
- def from_configuration(key, **options)
12
- new(key, class_name: options[:class], schedule: options[:schedule], arguments: options[:args])
13
- end
14
- end
15
-
16
- attr_reader :key, :schedule, :class_name, :arguments
17
-
18
- def initialize(key, class_name:, schedule:, arguments: nil)
19
- @key = key
20
- @class_name = class_name
21
- @schedule = schedule
22
- @arguments = Array(arguments)
23
- end
24
-
25
- def delay_from_now
26
- [ (next_time - Time.current).to_f, 0 ].max
27
- end
28
-
29
- def next_time
30
- parsed_schedule.next_time.utc
31
- end
32
-
33
- def enqueue(at:)
34
- if using_solid_queue_adapter?
35
- perform_later_and_record(run_at: at)
36
- else
37
- perform_later
38
- end
39
- end
40
-
41
- def valid?
42
- parsed_schedule.instance_of?(Fugit::Cron)
43
- end
44
-
45
- def to_s
46
- "#{class_name}.perform_later(#{arguments.map(&:inspect).join(",")}) [ #{parsed_schedule.original.to_s} ]"
47
- end
48
-
49
- def to_h
50
- {
51
- schedule: schedule,
52
- class_name: class_name,
53
- arguments: arguments
54
- }
55
- end
56
-
57
- private
58
- def using_solid_queue_adapter?
59
- job_class.queue_adapter_name.inquiry.solid_queue?
60
- end
61
-
62
- def perform_later_and_record(run_at:)
63
- RecurringExecution.record(key, run_at) { perform_later.provider_job_id }
64
- end
65
-
66
- def perform_later
67
- job_class.perform_later(*arguments_with_kwargs)
68
- end
69
-
70
- def arguments_with_kwargs
71
- if arguments.last.is_a?(Hash)
72
- arguments[0...-1] + [ Hash.ruby2_keywords_hash(arguments.last) ]
73
- else
74
- arguments
75
- end
76
- end
77
-
78
- def parsed_schedule
79
- @parsed_schedule ||= Fugit.parse(schedule)
80
- end
81
-
82
- def job_class
83
- @job_class ||= class_name.safe_constantize
84
- end
85
- end
86
- end
87
- end