Class: Postburner::ActiveJob::Payload

Inherits:
Object
  • Object
show all
Defined in:
lib/postburner/active_job/payload.rb

Overview

Handles serialization/deserialization of ActiveJob payloads for Beanstalkd.

Provides consistent payload format for both default and tracked jobs, with versioning support for future format changes.

Payload Format (V1)

Both default and tracked jobs store the same ActiveJob data in Beanstalkd. The only difference is tracked jobs also persist to PostgreSQL and include a postburner_job_id reference.

Examples:

Default job payload

{
  v: 1,
  tracked: false,
  postburner_job_id: nil,
  job_class: "SendEmail",
  job_id: "abc-123",
  queue_name: "mailers",
  arguments: [[1, 2, 3]],
  retry_count: 0,
  ...
}

Tracked job payload

{
  v: 1,
  tracked: true,
  postburner_job_id: 456,  # References postburner_jobs.id
  job_class: "ProcessPayment",
  job_id: "def-456",
  queue_name: "critical",
  arguments: [[789]],
  retry_count: 0,
  ...
}

Constant Summary collapse

VERSION =
1

Class Method Summary collapse

Class Method Details

.default_payload(job) ⇒ String

Generates JSON payload for a default job.

Parameters:

  • job (ActiveJob::Base)

    The ActiveJob instance

Returns:

  • (String)

    JSON-encoded payload



86
87
88
# File 'lib/postburner/active_job/payload.rb', line 86

def default_payload(job)
  JSON.generate(for_job(job, tracked: false))
end

.for_job(job, tracked: false, postburner_job_id: nil) ⇒ Hash

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Generates payload structure for an ActiveJob.

Parameters:

  • job (ActiveJob::Base)

    The ActiveJob instance

  • tracked (Boolean) (defaults to: false)

    Whether this is a tracked job

  • postburner_job_id (Integer, nil) (defaults to: nil)

    Postburner::Job ID for tracked jobs

Returns:

  • (Hash)

    Payload hash



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/postburner/active_job/payload.rb', line 56

def for_job(job, tracked: false, postburner_job_id: nil)
  # Get TTR from job class if available, otherwise use default
  ttr = job.class.respond_to?(:postburner_ttr) && job.class.postburner_ttr ||
        Postburner.configuration.default_ttr

  {
    v: VERSION,
    tracked: tracked,
    postburner_job_id: postburner_job_id,
    job_class: job.class.name,
    job_id: job.job_id,
    queue_name: job.queue_name,
    priority: job.priority,
    ttr: ttr,
    arguments: ::ActiveJob::Arguments.serialize(job.arguments),
    executions: job.executions,
    exception_executions: job.exception_executions || {},
    locale: job.locale,
    timezone: job.timezone,
    enqueued_at: job.enqueued_at&.iso8601,
    retry_count: 0  # For default job retry tracking
  }
end

.native_format?(payload) ⇒ Boolean Also known as: legacy_format?

Detects if a parsed payload is a native Postburner::Job format (as opposed to an ActiveJob adapter payload).

Native format: { "class" => "JobClassName", "args" => [job_id] }

Parameters:

  • payload (Hash)

    Parsed payload

Returns:

  • (Boolean)

    true if native Postburner::Job format



157
158
159
# File 'lib/postburner/active_job/payload.rb', line 157

def native_format?(payload)
  payload.key?('class') && payload.key?('args') && !payload.key?('v')
end

.parse(json_string) ⇒ Hash

Parses and validates a JSON payload from Beanstalkd.

Handles version checking and returns the parsed data.

Parameters:

  • json_string (String)

    JSON payload from Beanstalkd

Returns:

  • (Hash)

    Parsed payload with string keys

Raises:

  • (ArgumentError)

    if payload version is unknown



124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/postburner/active_job/payload.rb', line 124

def parse(json_string)
  data = JSON.parse(json_string)

  # Handle version
  version = data['v'] || data[:v] || 1

  case version
  when 1
    data.is_a?(Hash) ? data.stringify_keys : data
  else
    raise ArgumentError, "Unknown payload version: #{version}"
  end
end

.serialize_for_tracked(job) ⇒ Hash

Serializes ActiveJob data for PostgreSQL storage (tracked jobs).

Returns the same structure as for_job but as a plain Hash (not JSON string) for storage in Postburner::Job args column.

Parameters:

  • job (ActiveJob::Base)

    The ActiveJob instance

Returns:

  • (Hash)

    Payload hash for PostgreSQL storage



110
111
112
# File 'lib/postburner/active_job/payload.rb', line 110

def serialize_for_tracked(job)
  for_job(job, tracked: true).stringify_keys
end

.tracked?(payload) ⇒ Boolean

Detects if a parsed payload is for a tracked job.

Parameters:

  • payload (Hash)

    Parsed payload

Returns:

  • (Boolean)

    true if tracked, false otherwise



144
145
146
# File 'lib/postburner/active_job/payload.rb', line 144

def tracked?(payload)
  payload['tracked'] == true || payload[:tracked] == true
end

.tracked_payload(job, postburner_job_id) ⇒ String

Generates JSON payload for a tracked job.

Parameters:

  • job (ActiveJob::Base)

    The ActiveJob instance

  • postburner_job_id (Integer)

    Postburner::Job ID

Returns:

  • (String)

    JSON-encoded payload



97
98
99
# File 'lib/postburner/active_job/payload.rb', line 97

def tracked_payload(job, postburner_job_id)
  JSON.generate(for_job(job, tracked: true, postburner_job_id: postburner_job_id))
end