Class: Postburner::ActiveJob::Payload
- Inherits:
-
Object
- Object
- Postburner::ActiveJob::Payload
- 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.
Constant Summary collapse
- VERSION =
1
Class Method Summary collapse
-
.default_payload(job) ⇒ String
Generates JSON payload for a default job.
-
.for_job(job, tracked: false, postburner_job_id: nil) ⇒ Hash
private
Generates payload structure for an ActiveJob.
-
.native_format?(payload) ⇒ Boolean
(also: legacy_format?)
Detects if a parsed payload is a native Postburner::Job format (as opposed to an ActiveJob adapter payload).
-
.parse(json_string) ⇒ Hash
Parses and validates a JSON payload from Beanstalkd.
-
.serialize_for_tracked(job) ⇒ Hash
Serializes ActiveJob data for PostgreSQL storage (tracked jobs).
-
.tracked?(payload) ⇒ Boolean
Detects if a parsed payload is for a tracked job.
-
.tracked_payload(job, postburner_job_id) ⇒ String
Generates JSON payload for a tracked job.
Class Method Details
.default_payload(job) ⇒ String
Generates JSON payload for a default job.
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.
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] }
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.
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.
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.
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.
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 |