(ns metabase.task.refresh-slack-channel-user-cache (:require [clojurewerkz.quartzite.jobs :as jobs] [clojurewerkz.quartzite.schedule.cron :as cron] [clojurewerkz.quartzite.schedule.simple :as simple] [clojurewerkz.quartzite.triggers :as triggers] [metabase.integrations.slack :as slack] [metabase.task :as task] [metabase.util.log :as log])) | |
(set! *warn-on-reflection* true) | |
(defn ^:private job []
(if (slack/slack-configured?)
(let [_ (log/info "Starting Slack user/channel startup cache refresh...")
start-ms (System/currentTimeMillis)
_ (slack/refresh-channels-and-usernames!)]
(log/infof "Slack user/channel startup cache refreshed with %s entries, took %sms."
(count (:channels (slack/slack-cached-channels-and-usernames)))
(- (System/currentTimeMillis) start-ms)))
(log/info "Slack is not configured, not refreshing slack user/channel cache."))) | |
(def ^:private job-key "metabase.task.refresh-channel-cache.job") (def ^:private trigger-key "metabase.task.refresh-channel-cache.trigger") (def ^:private startup-job-key "metabase.task.on-startup-refresh-channel-cache.job") (def ^:private startup-trigger-key "metabase.task.on-startup-refresh-channel-cache.trigger") | |
General slack cache refresh job | (jobs/defjob RefreshCache [_] (job)) |
Startup cache refresh, with cleanup on failure. | (jobs/defjob RefreshCacheOnStartup [_]
(try (job)
(finally
(task/delete-task! (jobs/key startup-job-key)
(triggers/key startup-trigger-key))))) |
(defmethod task/init! ::RefreshSlackChannelsAndUsers
[_]
(let [job (jobs/build
(jobs/of-type RefreshCache)
(jobs/with-identity (jobs/key job-key)))
trigger (triggers/build
(triggers/with-identity (triggers/key trigger-key))
(triggers/with-schedule
(cron/schedule
(cron/cron-schedule
;; run every 4 hours at a random minute:
(format "0 %d 0/4 1/1 * ? *" (rand-int 60)))
(cron/with-misfire-handling-instruction-do-nothing)))
(triggers/start-now))
startup-job (jobs/build
(jobs/of-type RefreshCacheOnStartup)
(jobs/with-identity (jobs/key startup-job-key)))
startup-trigger (triggers/build
(triggers/with-identity (triggers/key startup-trigger-key))
(triggers/with-schedule
(simple/schedule (simple/with-interval-in-seconds 60)))
(triggers/start-now))]
(task/schedule-task! job trigger)
(task/schedule-task! startup-job startup-trigger))) | |