Module: Kaal
- Extended by:
- RegisterConflictSupport
- Defined in:
- lib/kaal.rb,
lib/kaal/cli.rb,
lib/kaal/core.rb,
lib/kaal/utils.rb,
lib/kaal/config.rb,
lib/kaal/runtime.rb,
lib/kaal/version.rb,
lib/kaal/registry.rb,
lib/kaal/backend/mysql.rb,
lib/kaal/backend/sqlite.rb,
lib/kaal/job_dispatcher.rb,
lib/kaal/scheduler_file.rb,
lib/kaal/sequel_support.rb,
lib/kaal/backend/adapter.rb,
lib/kaal/backend/postgres.rb,
lib/kaal/core/coordinator.rb,
lib/kaal/utils/cron_utils.rb,
lib/kaal/dispatch/registry.rb,
lib/kaal/support/hash_tools.rb,
lib/kaal/definition/registry.rb,
lib/kaal/config/configuration.rb,
lib/kaal/delayed_job/registry.rb,
lib/kaal/persistence/database.rb,
lib/kaal/utils/cron_humanizer.rb,
lib/kaal/active_record_support.rb,
lib/kaal/backend/redis_adapter.rb,
lib/kaal/dispatch/redis_engine.rb,
lib/kaal/scheduler_file/loader.rb,
lib/kaal/backend/memory_adapter.rb,
lib/kaal/core/occurrence_finder.rb,
lib/kaal/dispatch/memory_engine.rb,
lib/kaal/definition/redis_engine.rb,
lib/kaal/runtime/runtime_context.rb,
lib/kaal/backend/dispatch_logging.rb,
lib/kaal/definition/memory_engine.rb,
lib/kaal/delayed_job/redis_engine.rb,
lib/kaal/dispatch/database_engine.rb,
lib/kaal/delayed_job/memory_engine.rb,
lib/kaal/register_conflict_support.rb,
lib/kaal/definition/database_engine.rb,
lib/kaal/scheduler_file/job_applier.rb,
lib/kaal/delayed_job/database_engine.rb,
lib/kaal/runtime/signal_handler_chain.rb,
lib/kaal/scheduler_file/helper_bundle.rb,
lib/kaal/config/scheduler_config_error.rb,
lib/kaal/core/enabled_entry_enumerator.rb,
lib/kaal/definitions/registry_accessor.rb,
lib/kaal/internal/sequel/mysql_backend.rb,
lib/kaal/runtime/scheduler_boot_loader.rb,
lib/kaal/scheduler_file/hash_transform.rb,
lib/kaal/scheduler_file/job_normalizer.rb,
lib/kaal/scheduler_file/payload_loader.rb,
lib/kaal/definition/persistence_helpers.rb,
lib/kaal/backend/dispatch_attempt_logger.rb,
lib/kaal/persistence/migration_templates.rb,
lib/kaal/utils/idempotency_key_generator.rb,
lib/kaal/definitions/registration_service.rb,
lib/kaal/internal/sequel/database_backend.rb,
lib/kaal/internal/sequel/postgres_backend.rb,
lib/kaal/runtime/signal_handler_installer.rb,
lib/kaal/delayed_job/mysql_version_support.rb,
lib/kaal/backend/dispatch_registry_accessor.rb,
lib/kaal/config/delayed_job_security_policy.rb,
lib/kaal/internal/active_record/base_record.rb,
lib/kaal/internal/active_record/lock_record.rb,
lib/kaal/scheduler_file/placeholder_support.rb,
lib/kaal/config/scheduler_time_zone_resolver.rb,
lib/kaal/delayed_job/dispatch_failure_logger.rb,
lib/kaal/internal/active_record/mysql_backend.rb,
lib/kaal/internal/active_record/dispatch_record.rb,
lib/kaal/internal/active_record/database_backend.rb,
lib/kaal/internal/active_record/postgres_backend.rb,
lib/kaal/internal/active_record/definition_record.rb,
lib/kaal/internal/active_record/dispatch_registry.rb,
lib/kaal/internal/active_record/connection_support.rb,
lib/kaal/internal/active_record/delayed_job_record.rb,
lib/kaal/internal/active_record/definition_registry.rb,
lib/kaal/internal/active_record/migration_templates.rb,
lib/kaal/internal/active_record/delayed_job_registry.rb
Overview
Copyright Codevedas Inc. 2025-present
This source code is licensed under the MIT license found in the LICENSE file in the root directory of this source tree.
Defined Under Namespace
Modules: ActiveRecord, Backend, Config, Core, CronHumanizer, CronUtils, Definition, Definitions, DelayedJob, Dispatch, Internal, JobDispatcher, Persistence, RegisterConflictSupport, Runtime, SchedulerFile, SchedulerHashTransform, SchedulerPlaceholderSupport, Sequel, Support, Utils
Classes: CLI, Configuration, ConfigurationError, Coordinator, EnabledEntryEnumerator, IdempotencyKeyGenerator, OccurrenceFinder, Registry, RegistryError, RuntimeContext, SchedulerBootLoader, SchedulerConfigError, SchedulerFileLoader, SchedulerTimeZoneResolver, SignalHandlerChain, SignalHandlerInstaller
Constant Summary
collapse
- VERSION =
'0.5.0'
Class Method Summary
collapse
-
.backend ⇒ Object
-
.backend=(value) ⇒ Object
-
.configuration ⇒ Object
-
.configure {|configuration| ... } ⇒ Object
-
.coordinator ⇒ Object
-
.definition_registry ⇒ Object
-
.delayed_job_allowed_class_prefixes ⇒ Object
-
.delayed_job_allowed_class_prefixes=(value) ⇒ Object
-
.disable(key:) ⇒ Object
-
.dispatch_log_registry ⇒ Object
-
.dispatched?(key, fire_time) ⇒ Boolean
-
.enable(key:) ⇒ Object
-
.enqueue_at(at:, job_class:, args:, job_id:, queue: nil, connection: nil) ⇒ Object
Enqueue a one-off delayed job.
-
.lease_ttl ⇒ Object
-
.lease_ttl=(value) ⇒ Object
-
.lint(expression) ⇒ Object
-
.load_scheduler_file!(runtime_context: RuntimeContext.default) ⇒ Object
-
.logger ⇒ Object
-
.logger=(value) ⇒ Object
-
.namespace ⇒ Object
-
.namespace=(value) ⇒ Object
-
.register(key:, cron:, enqueue:) ⇒ Object
-
.registered ⇒ Object
-
.registered?(key:) ⇒ Boolean
-
.registry ⇒ Object
-
.reset_configuration! ⇒ Object
-
.reset_coordinator! ⇒ Object
-
.reset_registry! ⇒ Object
-
.restart! ⇒ Object
-
.running? ⇒ Boolean
-
.simplify(expression) ⇒ Object
-
.start! ⇒ Object
-
.stop!(timeout: 30) ⇒ Object
-
.tick! ⇒ Object
-
.tick_interval ⇒ Object
-
.tick_interval=(value) ⇒ Object
-
.time_zone ⇒ Object
-
.time_zone=(value) ⇒ Object
-
.to_human(expression, locale: nil) ⇒ Object
-
.unregister(key:) ⇒ Object
-
.valid?(expression) ⇒ Boolean
-
.validate ⇒ Object
-
.validate! ⇒ Object
-
.validation_warnings ⇒ Object
-
.warn_on_risky_configuration!(configuration: self.configuration, logger: configuration.logger) ⇒ Object
-
.window_lookahead ⇒ Object
-
.window_lookahead=(value) ⇒ Object
-
.window_lookback ⇒ Object
-
.window_lookback=(value) ⇒ Object
-
.with_idempotency(key, fire_time) {|IdempotencyKeyGenerator.call(key, fire_time, configuration: configuration)| ... } ⇒ Object
Class Method Details
.backend ⇒ Object
195
|
# File 'lib/kaal.rb', line 195
def backend = configuration.backend
|
.backend=(value) ⇒ Object
219
220
221
|
# File 'lib/kaal.rb', line 219
def backend=(value)
configuration.backend = value
end
|
.configuration ⇒ Object
47
48
49
|
# File 'lib/kaal.rb', line 47
def configuration
@configuration ||= Configuration.new
end
|
87
88
89
|
# File 'lib/kaal.rb', line 87
def configure
yield(configuration) if block_given?
end
|
.coordinator ⇒ Object
55
56
57
|
# File 'lib/kaal.rb', line 55
def coordinator
@coordinator ||= Coordinator.new(configuration: configuration, registry: registry)
end
|
.definition_registry ⇒ Object
239
240
241
|
# File 'lib/kaal.rb', line 239
def definition_registry
definitions_registry_accessor.call
end
|
.delayed_job_allowed_class_prefixes ⇒ Object
231
232
233
|
# File 'lib/kaal.rb', line 231
def delayed_job_allowed_class_prefixes
configuration.delayed_job_allowed_class_prefixes
end
|
.delayed_job_allowed_class_prefixes=(value) ⇒ Object
235
236
237
|
# File 'lib/kaal.rb', line 235
def delayed_job_allowed_class_prefixes=(value)
configuration.delayed_job_allowed_class_prefixes = value
end
|
.disable(key:) ⇒ Object
127
128
129
|
# File 'lib/kaal.rb', line 127
def disable(key:)
definition_registry.disable_definition(key)
end
|
.dispatch_log_registry ⇒ Object
186
187
188
|
# File 'lib/kaal.rb', line 186
def dispatch_log_registry
dispatch_registry_accessor.registry
end
|
.dispatched?(key, fire_time) ⇒ Boolean
182
183
184
|
# File 'lib/kaal.rb', line 182
def dispatched?(key, fire_time)
dispatch_registry_accessor.dispatched?(key, fire_time)
end
|
.enable(key:) ⇒ Object
123
124
125
|
# File 'lib/kaal.rb', line 123
def enable(key:)
definition_registry.enable_definition(key)
end
|
.enqueue_at(at:, job_class:, args:, job_id:, queue: nil, connection: nil) ⇒ Object
Enqueue a one-off delayed job. Delivery is at-most-once after claim.
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
|
# File 'lib/kaal.rb', line 153
def enqueue_at(at:, job_class:, args:, job_id:, queue: nil, connection: nil)
delayed_store = delayed_store!
resolved_run_at = normalize_delayed_run_at(at)
resolved_args = normalize_delayed_args(args)
resolved_queue = normalize_delayed_queue(queue)
resolved_job_id = normalize_delayed_job_id(job_id)
resolved_job_class = JobDispatcher.resolve_job_class(
job_class_name: job_class,
key: resolved_job_id,
queue: resolved_queue
)
resolved_job_class_name = JobDispatcher.normalize_job_class_name(resolved_job_class)
delayed_store.enqueue(
job_id: resolved_job_id,
run_at: resolved_run_at,
job_class: resolved_job_class_name,
args: resolved_args,
queue: resolved_queue,
connection: connection
)
end
|
.lease_ttl ⇒ Object
193
|
# File 'lib/kaal.rb', line 193
def lease_ttl = configuration.lease_ttl
|
.lease_ttl=(value) ⇒ Object
211
212
213
|
# File 'lib/kaal.rb', line 211
def lease_ttl=(value)
configuration.lease_ttl = value
end
|
.lint(expression) ⇒ Object
278
279
280
|
# File 'lib/kaal.rb', line 278
def lint(expression)
CronUtils.lint(expression)
end
|
.load_scheduler_file!(runtime_context: RuntimeContext.default) ⇒ Object
95
96
97
98
99
100
101
102
103
104
|
# File 'lib/kaal.rb', line 95
def load_scheduler_file!(runtime_context: RuntimeContext.default)
warn_on_risky_configuration!
SchedulerFileLoader.new(
configuration: configuration,
definition_registry: definition_registry,
registry: registry,
logger: configuration.logger,
runtime_context: runtime_context
).load
end
|
.logger ⇒ Object
196
|
# File 'lib/kaal.rb', line 196
def logger = configuration.logger
|
.logger=(value) ⇒ Object
223
224
225
|
# File 'lib/kaal.rb', line 223
def logger=(value)
configuration.logger = value
end
|
.namespace ⇒ Object
194
|
# File 'lib/kaal.rb', line 194
def namespace = configuration.namespace
|
.namespace=(value) ⇒ Object
215
216
217
|
# File 'lib/kaal.rb', line 215
def namespace=(value)
configuration.namespace = value
end
|
.register(key:, cron:, enqueue:) ⇒ Object
91
92
93
|
# File 'lib/kaal.rb', line 91
def register(key:, cron:, enqueue:)
registration_service.call(key:, cron:, enqueue:)
end
|
.registered ⇒ Object
111
112
113
114
115
116
117
|
# File 'lib/kaal.rb', line 111
def registered
definition_registry.all_definitions.map do |definition|
key = definition[:key]
callback = registry.find(key)&.enqueue
Registry::Entry.new(key: key, cron: definition[:cron], enqueue: callback).freeze
end
end
|
.registered?(key:) ⇒ Boolean
119
120
121
|
# File 'lib/kaal.rb', line 119
def registered?(key:)
!!definition_registry.find_definition(key)
end
|
.registry ⇒ Object
51
52
53
|
# File 'lib/kaal.rb', line 51
def registry
@registry ||= Registry.new
end
|
.reset_configuration! ⇒ Object
59
60
61
62
63
64
65
66
|
# File 'lib/kaal.rb', line 59
def reset_configuration!
@configuration = Configuration.new
@coordinator = nil
@definition_registry = nil
@definitions_registry_accessor = nil
@dispatch_registry_accessor = nil
@risky_configuration_warnings_emitted = {}
end
|
.reset_coordinator! ⇒ Object
77
78
79
80
81
82
83
84
85
|
# File 'lib/kaal.rb', line 77
def reset_coordinator!
if @coordinator&.running?
stopped = @coordinator.stop!
raise 'Failed to stop coordinator thread within timeout' unless stopped
end
@coordinator = nil
coordinator
end
|
.reset_registry! ⇒ Object
68
69
70
71
72
73
74
75
|
# File 'lib/kaal.rb', line 68
def reset_registry!
@registry = Registry.new
definition_registry = @definition_registry
definition_registry.clear if definition_registry.respond_to?(:clear)
delayed_store = configuration.backend&.delayed_store
delayed_store.clear if delayed_store.respond_to?(:clear)
@coordinator = nil
end
|
.restart! ⇒ Object
144
145
146
|
# File 'lib/kaal.rb', line 144
def restart!
coordinator.restart!
end
|
.running? ⇒ Boolean
140
141
142
|
# File 'lib/kaal.rb', line 140
def running?
coordinator.running?
end
|
.simplify(expression) ⇒ Object
274
275
276
|
# File 'lib/kaal.rb', line 274
def simplify(expression)
CronUtils.simplify(expression)
end
|
.start! ⇒ Object
131
132
133
134
|
# File 'lib/kaal.rb', line 131
def start!
warn_on_risky_configuration!
coordinator.start!
end
|
.stop!(timeout: 30) ⇒ Object
136
137
138
|
# File 'lib/kaal.rb', line 136
def stop!(timeout: 30)
coordinator.stop!(timeout: timeout)
end
|
.tick! ⇒ Object
148
149
150
|
# File 'lib/kaal.rb', line 148
def tick!
coordinator.tick!
end
|
.tick_interval ⇒ Object
190
|
# File 'lib/kaal.rb', line 190
def tick_interval = configuration.tick_interval
|
.tick_interval=(value) ⇒ Object
199
200
201
|
# File 'lib/kaal.rb', line 199
def tick_interval=(value)
configuration.tick_interval = value
end
|
.time_zone ⇒ Object
197
|
# File 'lib/kaal.rb', line 197
def time_zone = configuration.time_zone
|
.time_zone=(value) ⇒ Object
227
228
229
|
# File 'lib/kaal.rb', line 227
def time_zone=(value)
configuration.time_zone = value
end
|
.to_human(expression, locale: nil) ⇒ Object
282
283
284
|
# File 'lib/kaal.rb', line 282
def to_human(expression, locale: nil)
CronHumanizer.to_human(expression, locale: locale)
end
|
.unregister(key:) ⇒ Object
106
107
108
109
|
# File 'lib/kaal.rb', line 106
def unregister(key:)
definition_registry.remove_definition(key)
registry.remove(key)
end
|
.valid?(expression) ⇒ Boolean
270
271
272
|
# File 'lib/kaal.rb', line 270
def valid?(expression)
CronUtils.valid?(expression)
end
|
.validate ⇒ Object
243
244
245
|
# File 'lib/kaal.rb', line 243
def validate
configuration.validate
end
|
.validate! ⇒ Object
247
248
249
|
# File 'lib/kaal.rb', line 247
def validate!
configuration.validate!
end
|
.validation_warnings ⇒ Object
251
252
253
|
# File 'lib/kaal.rb', line 251
def validation_warnings
configuration.validation_warnings
end
|
.warn_on_risky_configuration!(configuration: self.configuration, logger: configuration.logger) ⇒ Object
255
256
257
258
259
260
261
262
263
264
265
266
267
268
|
# File 'lib/kaal.rb', line 255
def warn_on_risky_configuration!(configuration: self.configuration, logger: configuration.logger)
warnings = configuration.validation_warnings
return [] if warnings.empty?
@risky_configuration_warnings_emitted ||= {}
warnings.each do |warning|
next if @risky_configuration_warnings_emitted[warning]
logger&.warn(warning)
@risky_configuration_warnings_emitted[warning] = true
end
warnings
end
|
.window_lookahead ⇒ Object
192
|
# File 'lib/kaal.rb', line 192
def window_lookahead = configuration.window_lookahead
|
.window_lookahead=(value) ⇒ Object
207
208
209
|
# File 'lib/kaal.rb', line 207
def window_lookahead=(value)
configuration.window_lookahead = value
end
|
.window_lookback ⇒ Object
191
|
# File 'lib/kaal.rb', line 191
def window_lookback = configuration.window_lookback
|
.window_lookback=(value) ⇒ Object
203
204
205
|
# File 'lib/kaal.rb', line 203
def window_lookback=(value)
configuration.window_lookback = value
end
|
.with_idempotency(key, fire_time) {|IdempotencyKeyGenerator.call(key, fire_time, configuration: configuration)| ... } ⇒ Object
176
177
178
179
180
|
# File 'lib/kaal.rb', line 176
def with_idempotency(key, fire_time)
raise ArgumentError, 'block required' unless block_given?
yield(IdempotencyKeyGenerator.call(key, fire_time, configuration: configuration))
end
|