Module: Zizq::Job::ClassMethods

Includes:
Zizq::JobConfig
Defined in:
lib/zizq/job.rb

Instance Method Summary collapse

Methods included from Zizq::JobConfig

#zizq_backoff, #zizq_enqueue_request, #zizq_priority, #zizq_queue, #zizq_retention, #zizq_retry_limit, #zizq_unique, #zizq_unique_key, #zizq_unique_scope

Instance Method Details

#zizq_deserialize(payload) ⇒ Object

Deserialize a payload hash back into positional and keyword arguments.

The payload is a JSON decoded Hash.

The default implementation receives a Hash of the form:

{ "args" => [ 42, "Hello" ], "kwargs" => { "template": "example" } }

And returns an array for ‘args` and `kwargs` of the form:

[ [ 42, "Hello" ], {template: "example"} ]

Because the default implementation uses a JSON decoded Hash, any symbol keys that were present at enqueue-time will be string keys after decoding.

Any failure to deserialize the arguments will cause the job to fail and backoff according to the backoff policy.



104
105
106
107
108
# File 'lib/zizq/job.rb', line 104

def zizq_deserialize(payload) #: (Hash[String, untyped]) -> [Array[untyped], Hash[Symbol, untyped]]
  args   = payload.fetch("args")
  kwargs = payload.fetch("kwargs").transform_keys(&:to_sym)
  [args, kwargs]
end

#zizq_payload_filter(*args, **kwargs) ⇒ Object

Generate a jq expression that exactly matches payloads with the given arguments.

This is used for filtering in Zizq::Query.

Generates an expression of the form:

. == {"args":["a","b","c"],"kwargs":{"example":true,"other":false}}


118
119
120
121
# File 'lib/zizq/job.rb', line 118

def zizq_payload_filter(*args, **kwargs) #: (*untyped, **untyped) -> String
  payload = zizq_serialize(*args, **kwargs)
  ". == #{JSON.generate(payload)}"
end

#zizq_payload_subset_filter(*args, **kwargs) ⇒ Object

Generate a jq expression that matches jobs whose positional args start with the given values and whose kwargs contain the given key/value pairs.

This is used for filtering in Zizq::Query.

Generates expressions of the form:

(.args[0:2] == ["a","b"]) and (.kwargs | contains({"example":true}))


132
133
134
135
136
137
138
139
140
141
# File 'lib/zizq/job.rb', line 132

def zizq_payload_subset_filter(*args, **kwargs) #: (*untyped, **untyped) -> String
  payload = zizq_serialize(*args, **kwargs)
  serialized_args = payload.fetch("args")
  serialized_kwargs = payload.fetch("kwargs")

  [
    "(.args[0:#{serialized_args.size}] == #{JSON.generate(serialized_args)})",
    "(.kwargs | contains(#{JSON.generate(serialized_kwargs)}))"
  ].join(" and ")
end

#zizq_serialize(*args, **kwargs) ⇒ Object

Serialize positional and keyword arguments for the ‘#perform` method into a payload hash suitable for sending to the server.

The result must be a JSON encodable Hash.

The default implementation generates a hash of the form:

{ "args" => [ 42, "Hello" ], "kwargs" => { "template": "example" } }

If you override this method you almost certainly need to override ‘::zizq_deserialize`, `::zizq_payload_filter` and `::zizq_payload_subset_filter` too.

Any failure to deserialize the arguments will cause the job to fail and backoff according to the backoff policy.



82
83
84
# File 'lib/zizq/job.rb', line 82

def zizq_serialize(*args, **kwargs) #: (*untyped, **untyped) -> Hash[String, untyped]
  { "args" => args, "kwargs" => kwargs.transform_keys(&:to_s) }
end