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