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

Class Method Details

.backendObject



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

.configurationObject



47
48
49
# File 'lib/kaal.rb', line 47

def configuration
  @configuration ||= Configuration.new
end

.configure {|configuration| ... } ⇒ Object

Yields:



87
88
89
# File 'lib/kaal.rb', line 87

def configure
  yield(configuration) if block_given?
end

.coordinatorObject



55
56
57
# File 'lib/kaal.rb', line 55

def coordinator
  @coordinator ||= Coordinator.new(configuration: configuration, registry: registry)
end

.definition_registryObject



239
240
241
# File 'lib/kaal.rb', line 239

def definition_registry
  definitions_registry_accessor.call
end

.delayed_job_allowed_class_prefixesObject



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_registryObject



186
187
188
# File 'lib/kaal.rb', line 186

def dispatch_log_registry
  dispatch_registry_accessor.registry
end

.dispatched?(key, fire_time) ⇒ Boolean

Returns:

  • (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_ttlObject



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

.loggerObject



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

.namespaceObject



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

.registeredObject



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

Returns:

  • (Boolean)


119
120
121
# File 'lib/kaal.rb', line 119

def registered?(key:)
  !!definition_registry.find_definition(key)
end

.registryObject



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

Returns:

  • (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_intervalObject



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_zoneObject



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

Returns:

  • (Boolean)


270
271
272
# File 'lib/kaal.rb', line 270

def valid?(expression)
  CronUtils.valid?(expression)
end

.validateObject



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_warningsObject



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_lookaheadObject



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_lookbackObject



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

Yields:

Raises:

  • (ArgumentError)


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