From c3cca3414212413e22ef91a22df883ef18b72dc4 Mon Sep 17 00:00:00 2001 From: Keagan Date: Wed, 6 Aug 2025 16:15:24 +0200 Subject: [PATCH 01/16] added logging protocol --- src/congest/jobs.clj | 25 +++++++++++++++++-------- src/congest/logging.clj | 16 ++++++++++++++++ src/congest/util.clj | 2 +- 3 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 src/congest/logging.clj diff --git a/src/congest/jobs.clj b/src/congest/jobs.clj index d5be188..b790c28 100644 --- a/src/congest/jobs.clj +++ b/src/congest/jobs.clj @@ -1,11 +1,15 @@ (ns congest.jobs - (:require - [overtone.at-at :as at] - [congest.util :as util])) + (:require [overtone.at-at :as at] + [congest.logging :as logging]) + (:import (java.text SimpleDateFormat))) (defn- -get-time [] (.getTime (new java.util.Date))) +(defn get-formatted-time [] + (let [formatter (SimpleDateFormat. "yyyy-MM-dd HH:mm:ss")] + (.format formatter (-get-time)))) + (defn- -start-job [pool handler opts] (if ;; test with initial delay nil @@ -19,16 +23,19 @@ (at/after (:interval opts) handler pool))) -(defn- -create-stop [pool handler opts] +(defn- -create-stop [pool handler {:keys [logger] :or {logger (logging/->DefaultLogger)} :as opts}] (let [stop (-start-job pool handler opts)] (fn ([] - (util/dlog "Stopping job" at/stop stop)) ;; Log message before stopping the job + (logging/log-info! logger "Stopping job") + (at/stop stop)) ;; Log message before stopping the job ([kill?] (if kill? - (util/dlog "Killing job" at/kill stop) ;; Log message before killing the job - (util/dlog "Stopping job" at/stop stop)))))) ;; Log message before stopping the job + (do (logging/log-info! logger "Killing job") + (at/kill at/kill stop)) ;; Log message before killing the job + (do (logging/log-info! logger "Stopping job") + (at/stop stop))))))) ;; Log message before stopping the job (defn- -stop! [*jobs job-id kill?] (let [{:keys [stop]} (get-in @*jobs [job-id])] @@ -128,7 +135,7 @@ (register! [this opts]) (deregister! [this job-id]) (stop! [this job-id kill?]) - (read-jobs [this])) + (kill [this])) (defn create-job-service [initial-data] (let [*jobs (atom {}) @@ -146,6 +153,8 @@ (at/stop-and-reset-pool! job-pool :strategy :kill))))) (comment + (get-formatted-time) + (def initial-data-1 []) (def initial-data-2 [{:initial-delay 10 :auto-start true diff --git a/src/congest/logging.clj b/src/congest/logging.clj new file mode 100644 index 0000000..ca5bfa5 --- /dev/null +++ b/src/congest/logging.clj @@ -0,0 +1,16 @@ +(ns congest.logging + (:require [congest.jobs :refer [get-formatted-time]])) + +(defprotocol Logger + (log! [this level message]) + (log-info! [this message]) + (log-error! [this message])) + +(defrecord DefaultLogger [] + Logger + (log! [_ level message] + (println (str "[" (get-formatted-time) "] [" level "] " message))) + (log-info! [_ message] + (println (str "[" (get-formatted-time) "] [INFO] " message))) + (log-error! [_ message] + (println (str "[" (get-formatted-time) "] [ERROR] " message)))) diff --git a/src/congest/util.clj b/src/congest/util.clj index 216f24f..a045fb2 100644 --- a/src/congest/util.clj +++ b/src/congest/util.clj @@ -2,4 +2,4 @@ (defn dlog [message f & args] (println message) - (apply f args)) \ No newline at end of file + (apply f args)) From e191ad6c50f029948b2d0fa16694615fd5c0212a Mon Sep 17 00:00:00 2001 From: Keagan Date: Wed, 6 Aug 2025 16:16:42 +0200 Subject: [PATCH 02/16] updated build.clj to use deps-deploy to deploy the project to clojars --- build.clj | 19 ++++++++++--------- deps.edn | 6 +++--- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/build.clj b/build.clj index 9703ae9..610acbc 100644 --- a/build.clj +++ b/build.clj @@ -1,5 +1,6 @@ (ns build - (:require [clojure.tools.build.api :as b])) + (:require [clojure.tools.build.api :as b] + [deps-deploy.deps-deploy :as dd])) (def lib 'com.modulr-software/congest) (def version "0.1.0") @@ -18,14 +19,7 @@ :jar-file jar-file :basis basis :lib lib - :version version - :pom-data {:group (namespace lib) - :artifact (name lib) - :version version - :description "congest" - :url "https://github.com/modulr-software/congest" - :licenses [{:name "MIT" - :url "https://opensource.org/licenses/MIT"}]}})) + :version version})) (defn install [_] (b/install {:basis basis @@ -33,3 +27,10 @@ :version version :jar-file jar-file :class-dir class-dir})) + +(defn deploy [_] + (dd/deploy {:artifact jar-file + :pom-file "pom.xml" + :repo "clojars" + :username (System/getenv "CLOJARS_USERNAME") + :password (System/getenv "CLOJARS_PASSWORD")})) diff --git a/deps.edn b/deps.edn index 1d969d7..a11d672 100644 --- a/deps.edn +++ b/deps.edn @@ -16,6 +16,6 @@ {:exec-args {:watch? true :skip-meta :slow :fail-fast? true}} - :build {:deps {io.github.clojure/tools.build {:git/tag "v0.10.9" :git/sha "e405aac"}} - :ns-default build - :exec-fn build/jar}}} + :build {:deps {io.github.clojure/tools.build {:git/tag "v0.10.9" :git/sha "e405aac"} + slipset/deps-deploy {:mvn/version "0.2.2"}} + :ns-default build}}} From 3489e1c69e7d98ed2f2be489c99fbb962a757fc3 Mon Sep 17 00:00:00 2001 From: Keagan Date: Thu, 7 Aug 2025 14:16:25 +0200 Subject: [PATCH 03/16] added more oplog usages with more detailed messages --- src/congest/jobs.clj | 77 +++++++++++-------- .../{logging.clj => operation_logging.clj} | 2 +- 2 files changed, 46 insertions(+), 33 deletions(-) rename src/congest/{logging.clj => operation_logging.clj} (94%) diff --git a/src/congest/jobs.clj b/src/congest/jobs.clj index b790c28..0d75aec 100644 --- a/src/congest/jobs.clj +++ b/src/congest/jobs.clj @@ -1,6 +1,6 @@ (ns congest.jobs (:require [overtone.at-at :as at] - [congest.logging :as logging]) + [congest.operation-logging :as logging]) (:import (java.text SimpleDateFormat))) (defn- -get-time [] @@ -10,31 +10,40 @@ (let [formatter (SimpleDateFormat. "yyyy-MM-dd HH:mm:ss")] (.format formatter (-get-time)))) -(defn- -start-job [pool handler opts] +(defn- -start-job + [pool handler {:keys [logger recurring? interval initial-delay id] :or {logger (logging/->DefaultLogger)} :as _opts}] (if ;; test with initial delay nil - (:recurring? opts) - (at/every - (:interval opts) - handler - pool - :initial-delay - (max (:initial-delay opts) 100)) ;; set the minimum initial delay to 100 - - (at/after (:interval opts) handler pool))) - -(defn- -create-stop [pool handler {:keys [logger] :or {logger (logging/->DefaultLogger)} :as opts}] + recurring? + (do + (logging/log-info! + logger + (str "Starting recurring job with job-id '" id "' with " interval "ms interval and " initial-delay "ms delay.")) + (at/every + interval + handler + pool + :initial-delay + (max initial-delay 100))) ;; set the minimum initial delay to 100 + + (do + (logging/log-info! + logger + (str "Starting non-recurring job with job-id '" id "' with " interval "ms delay.")) + (at/after interval handler pool)))) + +(defn- -create-stop [pool handler {:keys [logger id] :or {logger (logging/->DefaultLogger)} :as opts}] (let [stop (-start-job pool handler opts)] (fn ([] - (logging/log-info! logger "Stopping job") + (logging/log-info! logger (str "Stopping job-id '" id "'...")) (at/stop stop)) ;; Log message before stopping the job ([kill?] (if kill? - (do (logging/log-info! logger "Killing job") + (do (logging/log-info! logger (str "Killing job-id '" id "'...")) (at/kill at/kill stop)) ;; Log message before killing the job - (do (logging/log-info! logger "Stopping job") + (do (logging/log-info! logger (str "Stopping job-id '" id "'...")) (at/stop stop))))))) ;; Log message before stopping the job (defn- -stop! [*jobs job-id kill?] @@ -52,19 +61,23 @@ (swap! *jobs dissoc job-id))) (defn- -handle-with-retries - ([job] - (-handle-with-retries job 0)) + ([opts job] + (-handle-with-retries opts job 0)) - ([job tries] + ([{:keys [logger id] :or {logger (logging/->DefaultLogger)}} job tries] (let [handler (:handler job) - max-retries (:max-retries job) + max-retries (or (:max-retries job) 0) + _ (logging/log-info! logger (str "Attempting to run job-id '" id "': attempt " (inc tries) " of " (inc max-retries) "...")) event (handler job)] - (if (and (< tries (or max-retries 0)) + (if (and (< tries max-retries) (= event :fail)) - (-handle-with-retries job - (inc tries)) - - (assoc job :event (or event :success)))))) ;; if event is nil then we default to success + (do + (logging/log-error! logger (str "Attempt " (inc tries) " of " (inc max-retries) " running job-id '" id "' failed.")) + (-handle-with-retries job + (inc tries))) + (do + (logging/log-info! logger (str "Attempt " (inc tries) " of " (inc max-retries) " running job-id '" id "' succeeded.")) + (assoc job :event (or event :success))))))) ;; if event is nil then we default to success (defmulti -maybe-deregister (fn [job] (:recurring? job))) @@ -99,24 +112,24 @@ (when (some? job) (dissoc job :event))) -(defn- -run-job [job] +(defn- -run-job [opts job] (->> job - (-handle-with-retries) + (-handle-with-retries opts) (-maybe-deregister) (-increase-calls) (-post-run-cleanup))) -(defn- -wrapper [*jobs job-id] +(defn- -wrapper [*jobs {:keys [id] :as opts}] (fn [] - (->> (get-in @*jobs [job-id]) - (-run-job) - (swap! *jobs assoc job-id)))) + (->> (get-in @*jobs [id]) + (-run-job opts) + (swap! *jobs assoc id)))) (defn- -register! [*jobs pool {:keys [id] :as opts}] (when-not (some? (get-in @*jobs [id])) (->> (-create-stop pool - (-wrapper *jobs id) + (-wrapper *jobs opts) opts) (assoc opts :created-at (-get-time) :stop) (swap! *jobs assoc id)))) diff --git a/src/congest/logging.clj b/src/congest/operation_logging.clj similarity index 94% rename from src/congest/logging.clj rename to src/congest/operation_logging.clj index ca5bfa5..ed3cbe8 100644 --- a/src/congest/logging.clj +++ b/src/congest/operation_logging.clj @@ -1,4 +1,4 @@ -(ns congest.logging +(ns congest.operation-logging (:require [congest.jobs :refer [get-formatted-time]])) (defprotocol Logger From b75f1348a7f4cf0200952fce4ab03b61aebf921b Mon Sep 17 00:00:00 2001 From: Keagan Date: Thu, 7 Aug 2025 15:06:55 +0200 Subject: [PATCH 04/16] fixed bug not detecting failures --- src/congest/jobs.clj | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/congest/jobs.clj b/src/congest/jobs.clj index 0d75aec..991c5a6 100644 --- a/src/congest/jobs.clj +++ b/src/congest/jobs.clj @@ -64,20 +64,25 @@ ([opts job] (-handle-with-retries opts job 0)) - ([{:keys [logger id] :or {logger (logging/->DefaultLogger)}} job tries] + ([{:keys [logger id] :or {logger (logging/->DefaultLogger)} :as opts} job tries] (let [handler (:handler job) max-retries (or (:max-retries job) 0) _ (logging/log-info! logger (str "Attempting to run job-id '" id "': attempt " (inc tries) " of " (inc max-retries) "...")) event (handler job)] (if (and (< tries max-retries) + (> max-retries 0) (= event :fail)) (do (logging/log-error! logger (str "Attempt " (inc tries) " of " (inc max-retries) " running job-id '" id "' failed.")) - (-handle-with-retries job + (-handle-with-retries opts job (inc tries))) - (do - (logging/log-info! logger (str "Attempt " (inc tries) " of " (inc max-retries) " running job-id '" id "' succeeded.")) - (assoc job :event (or event :success))))))) ;; if event is nil then we default to success + (if (= event :fail) + (do + (logging/log-error! logger (str "Attempt " (inc tries) " of " (inc max-retries) " running job-id '" id "' failed.")) + (assoc job :event :fail)) + (do + (logging/log-info! logger (str "Attempt " (inc tries) " of " (inc max-retries) " running job-id '" id "' succeeded.")) + (assoc job :event (or event :success)))))))) ;; if event is nil then we default to success (defmulti -maybe-deregister (fn [job] (:recurring? job))) @@ -178,7 +183,7 @@ :interval 1000 :recurring? true :created-at nil - :handler (fn [metadata] (println "RUN")) + :handler (fn [metadata] (println "RUN") :fail) :sleep false}]) (def js (create-job-service initial-data-2)) From 2fb8bf4cdff760a6c33e470e76b00eeaaefe4c2a Mon Sep 17 00:00:00 2001 From: Keagan Date: Mon, 11 Aug 2025 10:43:04 +0200 Subject: [PATCH 05/16] changed protocol to use extended opts and removed default logger --- src/congest/jobs.clj | 51 +++++++++++++++++++------------ src/congest/operation_logging.clj | 17 ++--------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/congest/jobs.clj b/src/congest/jobs.clj index 991c5a6..0a63996 100644 --- a/src/congest/jobs.clj +++ b/src/congest/jobs.clj @@ -11,14 +11,14 @@ (.format formatter (-get-time)))) (defn- -start-job - [pool handler {:keys [logger recurring? interval initial-delay id] :or {logger (logging/->DefaultLogger)} :as _opts}] + [pool handler {:keys [logger recurring? interval initial-delay] :as opts}] (if ;; test with initial delay nil recurring? (do - (logging/log-info! - logger - (str "Starting recurring job with job-id '" id "' with " interval "ms interval and " initial-delay "ms delay.")) + (when (some? logger) + (logging/log-info! logger (merge opts {:log-time (get-formatted-time) + :action "start"}))) (at/every interval handler @@ -27,23 +27,27 @@ (max initial-delay 100))) ;; set the minimum initial delay to 100 (do - (logging/log-info! - logger - (str "Starting non-recurring job with job-id '" id "' with " interval "ms delay.")) + (when (some? logger) + (logging/log-info! logger (merge opts {:log-time (get-formatted-time) + :action "start"}))) (at/after interval handler pool)))) -(defn- -create-stop [pool handler {:keys [logger id] :or {logger (logging/->DefaultLogger)} :as opts}] - (let [stop (-start-job pool handler opts)] +(defn- -create-stop [pool handler {:keys [logger] :as opts}] + (let [extended-opts (merge opts {:log-time (get-formatted-time)}) + stop (-start-job pool handler opts)] (fn ([] - (logging/log-info! logger (str "Stopping job-id '" id "'...")) + (when (some? logger) + (logging/log-info! logger (merge extended-opts {:action "stop"}))) (at/stop stop)) ;; Log message before stopping the job ([kill?] (if kill? - (do (logging/log-info! logger (str "Killing job-id '" id "'...")) + (do (when (some? logger) + (logging/log-info! logger (merge extended-opts {:action "kill"}))) (at/kill at/kill stop)) ;; Log message before killing the job - (do (logging/log-info! logger (str "Stopping job-id '" id "'...")) + (do (when (some? logger) + (logging/log-info! logger (merge extended-opts {:action "stop"}))) (at/stop stop))))))) ;; Log message before stopping the job (defn- -stop! [*jobs job-id kill?] @@ -64,24 +68,28 @@ ([opts job] (-handle-with-retries opts job 0)) - ([{:keys [logger id] :or {logger (logging/->DefaultLogger)} :as opts} job tries] + ([{:keys [logger] :as opts} job tries] (let [handler (:handler job) max-retries (or (:max-retries job) 0) - _ (logging/log-info! logger (str "Attempting to run job-id '" id "': attempt " (inc tries) " of " (inc max-retries) "...")) + extended-opts (merge opts {:log-time (get-formatted-time) + :action "run" + :tries tries + :max-retries max-retries}) + _ (logging/log-info! logger extended-opts) event (handler job)] (if (and (< tries max-retries) (> max-retries 0) (= event :fail)) (do - (logging/log-error! logger (str "Attempt " (inc tries) " of " (inc max-retries) " running job-id '" id "' failed.")) + (logging/log-error! logger (merge extended-opts {:event :fail})) (-handle-with-retries opts job (inc tries))) (if (= event :fail) (do - (logging/log-error! logger (str "Attempt " (inc tries) " of " (inc max-retries) " running job-id '" id "' failed.")) + (logging/log-error! logger (merge extended-opts {:event :fail})) (assoc job :event :fail)) (do - (logging/log-info! logger (str "Attempt " (inc tries) " of " (inc max-retries) " running job-id '" id "' succeeded.")) + (logging/log-info! logger (merge extended-opts {:event :success})) (assoc job :event (or event :success)))))))) ;; if event is nil then we default to success (defmulti -maybe-deregister (fn [job] (:recurring? job))) @@ -130,8 +138,11 @@ (-run-job opts) (swap! *jobs assoc id)))) -(defn- -register! [*jobs pool {:keys [id] :as opts}] +(defn- -register! [*jobs pool {:keys [logger id] :as opts}] (when-not (some? (get-in @*jobs [id])) + (when (some? logger) + (logging/log-info! logger (merge opts {:log-time (get-formatted-time) + :action "register"}))) (->> (-create-stop pool (-wrapper *jobs opts) @@ -153,7 +164,7 @@ (register! [this opts]) (deregister! [this job-id]) (stop! [this job-id kill?]) - (kill [this])) + (kill! [this])) (defn create-job-service [initial-data] (let [*jobs (atom {}) @@ -167,7 +178,7 @@ (-deregister! *jobs job-id)) (stop! [_ job-id kill?] (-stop! *jobs job-id kill?)) - (kill [_] + (kill! [_] (at/stop-and-reset-pool! job-pool :strategy :kill))))) (comment diff --git a/src/congest/operation_logging.clj b/src/congest/operation_logging.clj index ed3cbe8..dbcf957 100644 --- a/src/congest/operation_logging.clj +++ b/src/congest/operation_logging.clj @@ -1,16 +1,5 @@ -(ns congest.operation-logging - (:require [congest.jobs :refer [get-formatted-time]])) +(ns congest.operation-logging) (defprotocol Logger - (log! [this level message]) - (log-info! [this message]) - (log-error! [this message])) - -(defrecord DefaultLogger [] - Logger - (log! [_ level message] - (println (str "[" (get-formatted-time) "] [" level "] " message))) - (log-info! [_ message] - (println (str "[" (get-formatted-time) "] [INFO] " message))) - (log-error! [_ message] - (println (str "[" (get-formatted-time) "] [ERROR] " message)))) + (log-info! [this opts]) + (log-error! [this opts])) From 4608654c78265e983ebd5a6a291b105b6d580121 Mon Sep 17 00:00:00 2001 From: Keagan Date: Mon, 11 Aug 2025 11:44:58 +0200 Subject: [PATCH 06/16] removed protocol and using optional logger function --- src/congest/jobs.clj | 30 +++++++++++++++--------------- src/congest/operation_logging.clj | 5 ----- 2 files changed, 15 insertions(+), 20 deletions(-) delete mode 100644 src/congest/operation_logging.clj diff --git a/src/congest/jobs.clj b/src/congest/jobs.clj index 0a63996..beae598 100644 --- a/src/congest/jobs.clj +++ b/src/congest/jobs.clj @@ -1,6 +1,5 @@ (ns congest.jobs - (:require [overtone.at-at :as at] - [congest.operation-logging :as logging]) + (:require [overtone.at-at :as at]) (:import (java.text SimpleDateFormat))) (defn- -get-time [] @@ -17,8 +16,8 @@ recurring? (do (when (some? logger) - (logging/log-info! logger (merge opts {:log-time (get-formatted-time) - :action "start"}))) + (logger (merge opts {:log-time (get-formatted-time) + :action "start"}))) (at/every interval handler @@ -28,8 +27,8 @@ (do (when (some? logger) - (logging/log-info! logger (merge opts {:log-time (get-formatted-time) - :action "start"}))) + (logger (merge opts {:log-time (get-formatted-time) + :action "start"}))) (at/after interval handler pool)))) (defn- -create-stop [pool handler {:keys [logger] :as opts}] @@ -38,16 +37,16 @@ (fn ([] (when (some? logger) - (logging/log-info! logger (merge extended-opts {:action "stop"}))) + (logger (merge extended-opts {:action "stop"}))) (at/stop stop)) ;; Log message before stopping the job ([kill?] (if kill? (do (when (some? logger) - (logging/log-info! logger (merge extended-opts {:action "kill"}))) + (logger (merge extended-opts {:action "kill"}))) (at/kill at/kill stop)) ;; Log message before killing the job (do (when (some? logger) - (logging/log-info! logger (merge extended-opts {:action "stop"}))) + (logger (merge extended-opts {:action "stop"}))) (at/stop stop))))))) ;; Log message before stopping the job (defn- -stop! [*jobs job-id kill?] @@ -75,21 +74,21 @@ :action "run" :tries tries :max-retries max-retries}) - _ (logging/log-info! logger extended-opts) + _ (logger extended-opts) event (handler job)] (if (and (< tries max-retries) (> max-retries 0) (= event :fail)) (do - (logging/log-error! logger (merge extended-opts {:event :fail})) + (logger (merge extended-opts {:event :fail})) (-handle-with-retries opts job (inc tries))) (if (= event :fail) (do - (logging/log-error! logger (merge extended-opts {:event :fail})) + (logger (merge extended-opts {:event :fail})) (assoc job :event :fail)) (do - (logging/log-info! logger (merge extended-opts {:event :success})) + (logger (merge extended-opts {:event :success})) (assoc job :event (or event :success)))))))) ;; if event is nil then we default to success (defmulti -maybe-deregister (fn [job] (:recurring? job))) @@ -141,8 +140,8 @@ (defn- -register! [*jobs pool {:keys [logger id] :as opts}] (when-not (some? (get-in @*jobs [id])) (when (some? logger) - (logging/log-info! logger (merge opts {:log-time (get-formatted-time) - :action "register"}))) + (logger (merge opts {:log-time (get-formatted-time) + :action "register"}))) (->> (-create-stop pool (-wrapper *jobs opts) @@ -195,6 +194,7 @@ :recurring? true :created-at nil :handler (fn [metadata] (println "RUN") :fail) + :logger (fn [opts] (println opts)) :sleep false}]) (def js (create-job-service initial-data-2)) diff --git a/src/congest/operation_logging.clj b/src/congest/operation_logging.clj deleted file mode 100644 index dbcf957..0000000 --- a/src/congest/operation_logging.clj +++ /dev/null @@ -1,5 +0,0 @@ -(ns congest.operation-logging) - -(defprotocol Logger - (log-info! [this opts]) - (log-error! [this opts])) From b40e44edaaf8a3b0615162aa6f6216ac6d0cdd0d Mon Sep 17 00:00:00 2001 From: Keagan Date: Fri, 15 Aug 2025 13:12:07 +0200 Subject: [PATCH 07/16] updated build.clj and readme for deployment --- .gitignore | 1 + README.md | 9 +++++++++ build.clj | 26 ++++++++++++++++++++------ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index d9f4275..9452dd6 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ dev/dev.clj .clj-kondo/ .lsp/ nrepl.sh +.env diff --git a/README.md b/README.md index cea1a1b..500df41 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,15 @@ Mark your work-in-progress PR's with ```WIP``` in the PR title. Every PR needs a proper description. Please link the issue you are adressing and explain how the PR goes about fixing the issue / adding the required feature. +## Deployment + +In order to build a jar for Congest, run `clojure -T:build jar`. +This will create a `/target` directory with a jar, pom and all the necessary files for deployment. + +To delete the `/target` folder, run `clojure -T:build clean`. + +Finally, to deploy to clojars, run `env CLOJARS_USERNAME=clojars-username CLOJARS_PASSWORD=clojars-deploy-token clojure -T:build deploy`. + ## Thats all folks! # HAPPY HACKING!!!! diff --git a/build.clj b/build.clj index 610acbc..2c68cc8 100644 --- a/build.clj +++ b/build.clj @@ -2,17 +2,33 @@ (:require [clojure.tools.build.api :as b] [deps-deploy.deps-deploy :as dd])) -(def lib 'com.modulr-software/congest) +(def lib 'io.github.modulr-software/congest) (def version "0.1.0") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def jar-file (format "target/%s-%s.jar" (name lib) version)) +(def pom-template + [[:description "Clojure Job Scheduler"] + [:licenses + [:license + [:name "MIT"] + [:url "https://opensource.org/license/mit"]]] + [:developers + [:developer + [:name "Modulr-Software"]]]]) + (defn clean [_] (b/delete {:path "target"})) (defn jar [_] (clean nil) + (b/write-pom {:class-dir class-dir + :lib lib + :version version + :basis basis + :src-dirs ["src"] + :pom-data pom-template}) (b/copy-dir {:src-dirs ["src"] :target-dir class-dir}) (b/jar {:class-dir class-dir @@ -29,8 +45,6 @@ :class-dir class-dir})) (defn deploy [_] - (dd/deploy {:artifact jar-file - :pom-file "pom.xml" - :repo "clojars" - :username (System/getenv "CLOJARS_USERNAME") - :password (System/getenv "CLOJARS_PASSWORD")})) + (dd/deploy {:installer :remote + :artifact jar-file + :pom-file (b/pom-path {:lib lib :class-dir class-dir})})) From 3df80575a819015ef4e5c7096f7b191807182738 Mon Sep 17 00:00:00 2001 From: Keagan Date: Sat, 16 Aug 2025 11:30:39 +0200 Subject: [PATCH 08/16] removed date formatting --- src/congest/jobs.clj | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/src/congest/jobs.clj b/src/congest/jobs.clj index beae598..a155aac 100644 --- a/src/congest/jobs.clj +++ b/src/congest/jobs.clj @@ -1,14 +1,9 @@ (ns congest.jobs - (:require [overtone.at-at :as at]) - (:import (java.text SimpleDateFormat))) + (:require [overtone.at-at :as at])) (defn- -get-time [] (.getTime (new java.util.Date))) -(defn get-formatted-time [] - (let [formatter (SimpleDateFormat. "yyyy-MM-dd HH:mm:ss")] - (.format formatter (-get-time)))) - (defn- -start-job [pool handler {:keys [logger recurring? interval initial-delay] :as opts}] (if @@ -16,7 +11,7 @@ recurring? (do (when (some? logger) - (logger (merge opts {:log-time (get-formatted-time) + (logger (merge opts {:log-time (-get-time) :action "start"}))) (at/every interval @@ -27,12 +22,12 @@ (do (when (some? logger) - (logger (merge opts {:log-time (get-formatted-time) + (logger (merge opts {:log-time (-get-time) :action "start"}))) (at/after interval handler pool)))) (defn- -create-stop [pool handler {:keys [logger] :as opts}] - (let [extended-opts (merge opts {:log-time (get-formatted-time)}) + (let [extended-opts (merge opts {:log-time (-get-time)}) stop (-start-job pool handler opts)] (fn ([] @@ -70,7 +65,7 @@ ([{:keys [logger] :as opts} job tries] (let [handler (:handler job) max-retries (or (:max-retries job) 0) - extended-opts (merge opts {:log-time (get-formatted-time) + extended-opts (merge opts {:log-time (-get-time) :action "run" :tries tries :max-retries max-retries}) @@ -140,7 +135,7 @@ (defn- -register! [*jobs pool {:keys [logger id] :as opts}] (when-not (some? (get-in @*jobs [id])) (when (some? logger) - (logger (merge opts {:log-time (get-formatted-time) + (logger (merge opts {:log-time (-get-time) :action "register"}))) (->> (-create-stop pool @@ -181,8 +176,6 @@ (at/stop-and-reset-pool! job-pool :strategy :kill))))) (comment - (get-formatted-time) - (def initial-data-1 []) (def initial-data-2 [{:initial-delay 10 :auto-start true From 54eb396468e1711c1db4933c79428ec5d19743e3 Mon Sep 17 00:00:00 2001 From: Keagan Date: Sat, 16 Aug 2025 11:31:41 +0200 Subject: [PATCH 09/16] updated version --- build.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.clj b/build.clj index 2c68cc8..0fb8dc1 100644 --- a/build.clj +++ b/build.clj @@ -3,7 +3,7 @@ [deps-deploy.deps-deploy :as dd])) (def lib 'io.github.modulr-software/congest) -(def version "0.1.0") +(def version "0.1.1") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def jar-file (format "target/%s-%s.jar" (name lib) version)) From fe3a8d5b31e2b792939d2d25a4efe1c2cb2eebd8 Mon Sep 17 00:00:00 2001 From: Keagan Date: Sat, 16 Aug 2025 13:45:30 +0200 Subject: [PATCH 10/16] fixed bug preventing ignoring stop-after-fail false --- build.clj | 2 +- src/congest/jobs.clj | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/build.clj b/build.clj index 0fb8dc1..9b16e5d 100644 --- a/build.clj +++ b/build.clj @@ -3,7 +3,7 @@ [deps-deploy.deps-deploy :as dd])) (def lib 'io.github.modulr-software/congest) -(def version "0.1.1") +(def version "0.1.2") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def jar-file (format "target/%s-%s.jar" (name lib) version)) diff --git a/src/congest/jobs.clj b/src/congest/jobs.clj index a155aac..c1e8e6b 100644 --- a/src/congest/jobs.clj +++ b/src/congest/jobs.clj @@ -69,7 +69,6 @@ :action "run" :tries tries :max-retries max-retries}) - _ (logger extended-opts) event (handler job)] (if (and (< tries max-retries) (> max-retries 0) @@ -88,11 +87,11 @@ (defmulti -maybe-deregister (fn [job] (:recurring? job))) -(defmethod -maybe-deregister true [{:keys [stop-after-fail? +(defmethod -maybe-deregister true [{:keys [stop-after-fail stop kill-after] :as job}] (cond (= (:event job) :fail) - (if (and (some? stop-after-fail?) (not stop-after-fail?)) + (if (and (some? stop-after-fail) (not stop-after-fail)) (assoc job :num-fails (inc (or (:num-fails job) 0))) (do @@ -133,10 +132,10 @@ (swap! *jobs assoc id)))) (defn- -register! [*jobs pool {:keys [logger id] :as opts}] + (when (some? logger) + (logger (merge opts {:log-time (-get-time) + :action "register"}))) (when-not (some? (get-in @*jobs [id])) - (when (some? logger) - (logger (merge opts {:log-time (-get-time) - :action "register"}))) (->> (-create-stop pool (-wrapper *jobs opts) @@ -181,13 +180,13 @@ :auto-start true :stop-after-fail false, :id "test" - :kill-after 1 - :num-calls nil + ;:kill-after 1 + ;:num-calls nil :interval 1000 :recurring? true :created-at nil :handler (fn [metadata] (println "RUN") :fail) - :logger (fn [opts] (println opts)) + :logger (fn [opts] (println (:action opts))) :sleep false}]) (def js (create-job-service initial-data-2)) From 4b6368db04376a91bae323ecd46cc8a083d88908 Mon Sep 17 00:00:00 2001 From: Keagan Date: Mon, 18 Aug 2025 11:58:13 +0200 Subject: [PATCH 11/16] fixed at/kill throwing --- src/congest/jobs.clj | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/congest/jobs.clj b/src/congest/jobs.clj index c1e8e6b..b0bfec3 100644 --- a/src/congest/jobs.clj +++ b/src/congest/jobs.clj @@ -39,7 +39,7 @@ (if kill? (do (when (some? logger) (logger (merge extended-opts {:action "kill"}))) - (at/kill at/kill stop)) ;; Log message before killing the job + (at/kill stop)) ;; Log message before killing the job (do (when (some? logger) (logger (merge extended-opts {:action "stop"}))) (at/stop stop))))))) ;; Log message before stopping the job @@ -185,9 +185,12 @@ :interval 1000 :recurring? true :created-at nil - :handler (fn [metadata] (println "RUN") :fail) + :handler (fn [metadata] (println "RUN")) :logger (fn [opts] (println (:action opts))) :sleep false}]) (def js (create-job-service initial-data-2)) - (stop! js "test" false)) + (deregister! js "test") + (stop! js "test" true) + + ()) From 9b6e366a95a37c12f3b132f9ae6090148f6a3d6b Mon Sep 17 00:00:00 2001 From: Keagan Date: Mon, 18 Aug 2025 12:01:00 +0200 Subject: [PATCH 12/16] updated version --- build.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.clj b/build.clj index 9b16e5d..abe58ab 100644 --- a/build.clj +++ b/build.clj @@ -3,7 +3,7 @@ [deps-deploy.deps-deploy :as dd])) (def lib 'io.github.modulr-software/congest) -(def version "0.1.2") +(def version "0.1.3") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def jar-file (format "target/%s-%s.jar" (name lib) version)) From 9002795cd85081128f374268a063c6a0eacefe12 Mon Sep 17 00:00:00 2001 From: Keagan Date: Tue, 19 Aug 2025 15:14:41 +0200 Subject: [PATCH 13/16] added oplog for deregistering --- build.clj | 2 +- src/congest/jobs.clj | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/build.clj b/build.clj index abe58ab..2d8591d 100644 --- a/build.clj +++ b/build.clj @@ -3,7 +3,7 @@ [deps-deploy.deps-deploy :as dd])) (def lib 'io.github.modulr-software/congest) -(def version "0.1.3") +(def version "0.1.4") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def jar-file (format "target/%s-%s.jar" (name lib) version)) diff --git a/src/congest/jobs.clj b/src/congest/jobs.clj index b0bfec3..966b8b1 100644 --- a/src/congest/jobs.clj +++ b/src/congest/jobs.clj @@ -53,10 +53,13 @@ (stop false)))) (defn- -deregister! [*jobs job-id] - (when - (some? (get-in @*jobs [job-id])) - (-stop! *jobs job-id true) - (swap! *jobs dissoc job-id))) + (let [{:keys [logger] :as opts} (get-in @*jobs [job-id])] + (when (some? opts) + (when (some? logger) + (logger (merge opts {:log-time (-get-time) + :action "deregister"}))) + (-stop! *jobs job-id true) + (swap! *jobs dissoc job-id)))) (defn- -handle-with-retries ([opts job] From 6c510111353cc89424176d4a504d755c07c32741 Mon Sep 17 00:00:00 2001 From: Keagan Date: Wed, 20 Aug 2025 13:41:37 +0200 Subject: [PATCH 14/16] fixed num-calls not being incremented in oplog --- build.clj | 2 +- src/congest/jobs.clj | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/build.clj b/build.clj index 2d8591d..2ce61fd 100644 --- a/build.clj +++ b/build.clj @@ -3,7 +3,7 @@ [deps-deploy.deps-deploy :as dd])) (def lib 'io.github.modulr-software/congest) -(def version "0.1.4") +(def version "0.1.5") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def jar-file (format "target/%s-%s.jar" (name lib) version)) diff --git a/src/congest/jobs.clj b/src/congest/jobs.clj index 966b8b1..bb2da17 100644 --- a/src/congest/jobs.clj +++ b/src/congest/jobs.clj @@ -62,13 +62,13 @@ (swap! *jobs dissoc job-id)))) (defn- -handle-with-retries - ([opts job] - (-handle-with-retries opts job 0)) + ([job] + (-handle-with-retries job 0)) - ([{:keys [logger] :as opts} job tries] + ([{:keys [logger] :as job} tries] (let [handler (:handler job) max-retries (or (:max-retries job) 0) - extended-opts (merge opts {:log-time (-get-time) + extended-opts (merge job {:log-time (-get-time) :action "run" :tries tries :max-retries max-retries}) @@ -78,7 +78,7 @@ (= event :fail)) (do (logger (merge extended-opts {:event :fail})) - (-handle-with-retries opts job + (-handle-with-retries job (inc tries))) (if (= event :fail) (do @@ -121,9 +121,9 @@ (when (some? job) (dissoc job :event))) -(defn- -run-job [opts job] +(defn- -run-job [job] (->> job - (-handle-with-retries opts) + (-handle-with-retries) (-maybe-deregister) (-increase-calls) (-post-run-cleanup))) @@ -131,7 +131,7 @@ (defn- -wrapper [*jobs {:keys [id] :as opts}] (fn [] (->> (get-in @*jobs [id]) - (-run-job opts) + (-run-job) (swap! *jobs assoc id)))) (defn- -register! [*jobs pool {:keys [logger id] :as opts}] @@ -183,13 +183,13 @@ :auto-start true :stop-after-fail false, :id "test" - ;:kill-after 1 - ;:num-calls nil + :kill-after 5 + :num-calls 0 :interval 1000 :recurring? true :created-at nil :handler (fn [metadata] (println "RUN")) - :logger (fn [opts] (println (:action opts))) + :logger (fn [opts] (println opts)) :sleep false}]) (def js (create-job-service initial-data-2)) From e419ae0f36be06fee4400c649f0036fbf52787e2 Mon Sep 17 00:00:00 2001 From: Keagan Date: Mon, 25 Aug 2025 09:29:39 +0200 Subject: [PATCH 15/16] prevent calling nil logger --- build.clj | 2 +- src/congest/jobs.clj | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/build.clj b/build.clj index 2ce61fd..428c2b0 100644 --- a/build.clj +++ b/build.clj @@ -3,7 +3,7 @@ [deps-deploy.deps-deploy :as dd])) (def lib 'io.github.modulr-software/congest) -(def version "0.1.5") +(def version "0.1.6") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def jar-file (format "target/%s-%s.jar" (name lib) version)) diff --git a/src/congest/jobs.clj b/src/congest/jobs.clj index bb2da17..237c101 100644 --- a/src/congest/jobs.clj +++ b/src/congest/jobs.clj @@ -69,23 +69,26 @@ (let [handler (:handler job) max-retries (or (:max-retries job) 0) extended-opts (merge job {:log-time (-get-time) - :action "run" - :tries tries - :max-retries max-retries}) + :action "run" + :tries tries + :max-retries max-retries}) event (handler job)] (if (and (< tries max-retries) (> max-retries 0) (= event :fail)) (do - (logger (merge extended-opts {:event :fail})) + (when (some? logger) + (logger (merge extended-opts {:event :fail}))) (-handle-with-retries job (inc tries))) (if (= event :fail) (do - (logger (merge extended-opts {:event :fail})) + (when (some? logger) + (logger (merge extended-opts {:event :fail}))) (assoc job :event :fail)) (do - (logger (merge extended-opts {:event :success})) + (when (some? logger) + (logger (merge extended-opts {:event :success}))) (assoc job :event (or event :success)))))))) ;; if event is nil then we default to success (defmulti -maybe-deregister (fn [job] (:recurring? job))) From 6fbdf7a24771db057c0dcfdf78ffbae217fc7436 Mon Sep 17 00:00:00 2001 From: Keagan Date: Tue, 18 Nov 2025 11:40:01 +0200 Subject: [PATCH 16/16] added protocol method to view all jobs in congest --- build.clj | 2 +- src/congest/jobs.clj | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/build.clj b/build.clj index 428c2b0..f00a783 100644 --- a/build.clj +++ b/build.clj @@ -3,7 +3,7 @@ [deps-deploy.deps-deploy :as dd])) (def lib 'io.github.modulr-software/congest) -(def version "0.1.6") +(def version "0.1.7") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def jar-file (format "target/%s-%s.jar" (name lib) version)) diff --git a/src/congest/jobs.clj b/src/congest/jobs.clj index 237c101..d78e872 100644 --- a/src/congest/jobs.clj +++ b/src/congest/jobs.clj @@ -87,7 +87,7 @@ (logger (merge extended-opts {:event :fail}))) (assoc job :event :fail)) (do - (when (some? logger) + (when (some? logger) (logger (merge extended-opts {:event :success}))) (assoc job :event (or event :success)))))))) ;; if event is nil then we default to success @@ -163,7 +163,8 @@ (register! [this opts]) (deregister! [this job-id]) (stop! [this job-id kill?]) - (kill! [this])) + (kill! [this]) + (view [this])) (defn create-job-service [initial-data] (let [*jobs (atom {}) @@ -178,7 +179,9 @@ (stop! [_ job-id kill?] (-stop! *jobs job-id kill?)) (kill! [_] - (at/stop-and-reset-pool! job-pool :strategy :kill))))) + (at/stop-and-reset-pool! job-pool :strategy :kill)) + (view [_] + @*jobs)))) (comment (def initial-data-1 []) @@ -186,9 +189,9 @@ :auto-start true :stop-after-fail false, :id "test" - :kill-after 5 + ;:kill-after 5 :num-calls 0 - :interval 1000 + :interval 60000 :recurring? true :created-at nil :handler (fn [metadata] (println "RUN")) @@ -196,6 +199,7 @@ :sleep false}]) (def js (create-job-service initial-data-2)) + (view js) (deregister! js "test") (stop! js "test" true)