Class: Xeno::ScheduleJob
- Inherits:
-
ApplicationJob
- Object
- ActiveJob::Base
- ApplicationJob
- Xeno::ScheduleJob
- Defined in:
- app/jobs/xeno/schedule_job.rb
Overview
Fires one scheduled run: a fire-and-forget task-mode session under the app principal, enqueued by Solid Queue recurring entries or the dev dispatch endpoint.
At-least-once safe: queues redeliver, and recurring dedup covers only the enqueue. The dedup row claims this job_id in the same transaction that opens the session, so a redelivered tick can never double-open — it re-enqueues the recorded turn instead.
Constant Summary collapse
- DEDUP_SCOPE =
"schedule_run".freeze
Instance Method Summary collapse
Instance Method Details
#perform(name) ⇒ Object
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'app/jobs/xeno/schedule_job.rb', line 17 def perform(name) definition = Xeno.definition schedule = definition.schedules[name] raise ArgumentError, "unknown schedule: #{name}" unless schedule turn = nil claimed = Session.transaction do Dedup.claim(DEDUP_SCOPE, job_id, metadata: { "schedule" => name }).tap do |row| next unless row session = Session.open!( message: schedule.prompt, channel: "schedule", principal: { "type" => "app", "schedule" => name }, definition: definition ) turn = session.turns.order(:sequence).last row.update!(metadata: row..merge("session_id" => session.id, "turn_id" => turn.id)) end end turn ||= redelivered_turn(claimed) TurnJob.perform_now(turn.id) if turn end |