aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvar Refsdal <ivar.refsdal@nsd.no>2021-09-27 14:36:24 +0200
committerIvar Refsdal <ivar.refsdal@nsd.no>2021-09-27 14:36:24 +0200
commit79acba1b716685bb601e05a2e9824eefd19d1f5d (patch)
treed014d59f94251e52689a03e4ab399aa1ea0dc374
parentRelease 0.2.37 (diff)
downloadfiinha-79acba1b716685bb601e05a2e9824eefd19d1f5d.tar.gz
fiinha-79acba1b716685bb601e05a2e9824eefd19d1f5d.tar.xz
Add :valid-payload? function
-rw-r--r--README.md2
-rw-r--r--src/com/github/ivarref/yoltq/impl.clj4
-rw-r--r--test/com/github/ivarref/yoltq/virtual_test.clj11
3 files changed, 17 insertions, 0 deletions
diff --git a/README.md b/README.md
index 314c779..7e49431 100644
--- a/README.md
+++ b/README.md
@@ -146,6 +146,8 @@ the payload. It can be added like this:
; An optional map of queue opts
{:allow-cas-failure? true ; Treat [:db.cas ...] failures as success. This is one way for the
; consumer function to ensure idempotence.
+ :valid-payload? (fn [payload] (some? (:id payload))) ; Function that verifies payload. Should return truthy for valid payloads.
+ ; The default function always returns true.
:max-retries 10}) ; Specify maximum number of times an item will be retried. Default: 100
```
diff --git a/src/com/github/ivarref/yoltq/impl.clj b/src/com/github/ivarref/yoltq/impl.clj
index 02cc102..8b75fc3 100644
--- a/src/com/github/ivarref/yoltq/impl.clj
+++ b/src/com/github/ivarref/yoltq/impl.clj
@@ -40,6 +40,7 @@
(if-let [q-config (get-in config [:handlers queue-name])]
(let [id (u/squuid)
depends-on (get q-config :depends-on (fn [_] nil))
+ valid-payload? (get q-config :valid-payload? (fn [_] true))
opts (merge
(when-let [deps (depends-on payload)]
{:depends-on deps})
@@ -49,6 +50,9 @@
{}
(or capture-bindings []))
(pr-str-safe :capture-bindings))]
+ (when-not (valid-payload? payload)
+ (log/error "Payload was not valid. Payload was:" payload)
+ (throw (ex-info (str "Payload was not valid: " payload) {:payload payload})))
(log/debug "queue item" (str id) "for queue" queue-name "is pending status" u/status-init)
(merge
{:com.github.ivarref.yoltq/id id
diff --git a/test/com/github/ivarref/yoltq/virtual_test.clj b/test/com/github/ivarref/yoltq/virtual_test.clj
index 8f7b454..acd3eb7 100644
--- a/test/com/github/ivarref/yoltq/virtual_test.clj
+++ b/test/com/github/ivarref/yoltq/virtual_test.clj
@@ -331,3 +331,14 @@
(yq/add-consumer! :a identity)
(timbre/with-level :fatal
(is (thrown? Exception @(d/transact conn [(yq/put :a {:broken #'=})]))))))
+
+
+(deftest payload-verifier
+ (let [conn (u/empty-conn)]
+ (yq/init! {:conn conn})
+ (yq/add-consumer! :q identity
+ {:valid-payload? (fn [{:keys [id]}]
+ (some? id))})
+ @(d/transact conn [(yq/put :q {:id "a"})])
+ (timbre/with-level :fatal
+ (is (thrown? Exception @(d/transact conn [(yq/put :q {})])))))) \ No newline at end of file