Skip to content

Commit b415fe5

Browse files
preporbeetleman
andauthored
Bump versions and persistence tests (#14)
* upgrade all deps, clojure and quartz included * update location of scripts for tables creation * run tests against postgresql * docker-compose based testing Co-authored-by: Mateusz Probachta (Beetleman) <[email protected]>
1 parent 46bb757 commit b415fe5

File tree

8 files changed

+301
-18
lines changed

8 files changed

+301
-18
lines changed

.dockerignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/target

.travis.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1-
language: clojure
1+
language: minimal
2+
services:
3+
- docker
4+
5+
script:
6+
- docker-compose run app lein test

Dockerfile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM clojure:openjdk-11-lein-2.9.1
2+
COPY . /usr/src/app
3+
WORKDIR /usr/src/app

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ Define simple or cron trigger via map:
104104

105105
You can persist your jobs and triggers in JDBC-store.
106106

107-
First of all, you need to create tables, see these scripts – http://svn.terracotta.org/svn/quartz/tags/quartz-2.2.1/distribution/src/main/assembly/root/docs/dbTables/
107+
First of all, you need to create tables, see these scripts – https://github.com/quartz-scheduler/quartz/tree/v2.3.2/quartz-core/src/main/resources/org/quartz/impl/jdbcjobstore
108108

109109
Secondly, configure Quartz for your store. You should also pick a well-defined name for your scheduler:
110110

dev-resources/tables_postgres.sql

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
-- Thanks to Patrick Lightbody for submitting this...
2+
--
3+
-- In your Quartz properties file, you'll need to set
4+
-- org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
5+
6+
DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
7+
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
8+
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
9+
DROP TABLE IF EXISTS QRTZ_LOCKS;
10+
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
11+
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
12+
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
13+
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
14+
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
15+
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
16+
DROP TABLE IF EXISTS QRTZ_CALENDARS;
17+
18+
CREATE TABLE QRTZ_JOB_DETAILS
19+
(
20+
SCHED_NAME VARCHAR(120) NOT NULL,
21+
JOB_NAME VARCHAR(200) NOT NULL,
22+
JOB_GROUP VARCHAR(200) NOT NULL,
23+
DESCRIPTION VARCHAR(250) NULL,
24+
JOB_CLASS_NAME VARCHAR(250) NOT NULL,
25+
IS_DURABLE BOOL NOT NULL,
26+
IS_NONCONCURRENT BOOL NOT NULL,
27+
IS_UPDATE_DATA BOOL NOT NULL,
28+
REQUESTS_RECOVERY BOOL NOT NULL,
29+
JOB_DATA BYTEA NULL,
30+
PRIMARY KEY (SCHED_NAME, JOB_NAME, JOB_GROUP)
31+
);
32+
33+
CREATE TABLE QRTZ_TRIGGERS
34+
(
35+
SCHED_NAME VARCHAR(120) NOT NULL,
36+
TRIGGER_NAME VARCHAR(200) NOT NULL,
37+
TRIGGER_GROUP VARCHAR(200) NOT NULL,
38+
JOB_NAME VARCHAR(200) NOT NULL,
39+
JOB_GROUP VARCHAR(200) NOT NULL,
40+
DESCRIPTION VARCHAR(250) NULL,
41+
NEXT_FIRE_TIME BIGINT NULL,
42+
PREV_FIRE_TIME BIGINT NULL,
43+
PRIORITY INTEGER NULL,
44+
TRIGGER_STATE VARCHAR(16) NOT NULL,
45+
TRIGGER_TYPE VARCHAR(8) NOT NULL,
46+
START_TIME BIGINT NOT NULL,
47+
END_TIME BIGINT NULL,
48+
CALENDAR_NAME VARCHAR(200) NULL,
49+
MISFIRE_INSTR SMALLINT NULL,
50+
JOB_DATA BYTEA NULL,
51+
PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
52+
FOREIGN KEY (SCHED_NAME, JOB_NAME, JOB_GROUP)
53+
REFERENCES QRTZ_JOB_DETAILS (SCHED_NAME, JOB_NAME, JOB_GROUP)
54+
);
55+
56+
CREATE TABLE QRTZ_SIMPLE_TRIGGERS
57+
(
58+
SCHED_NAME VARCHAR(120) NOT NULL,
59+
TRIGGER_NAME VARCHAR(200) NOT NULL,
60+
TRIGGER_GROUP VARCHAR(200) NOT NULL,
61+
REPEAT_COUNT BIGINT NOT NULL,
62+
REPEAT_INTERVAL BIGINT NOT NULL,
63+
TIMES_TRIGGERED BIGINT NOT NULL,
64+
PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
65+
FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
66+
REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
67+
);
68+
69+
CREATE TABLE QRTZ_CRON_TRIGGERS
70+
(
71+
SCHED_NAME VARCHAR(120) NOT NULL,
72+
TRIGGER_NAME VARCHAR(200) NOT NULL,
73+
TRIGGER_GROUP VARCHAR(200) NOT NULL,
74+
CRON_EXPRESSION VARCHAR(120) NOT NULL,
75+
TIME_ZONE_ID VARCHAR(80),
76+
PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
77+
FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
78+
REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
79+
);
80+
81+
CREATE TABLE QRTZ_SIMPROP_TRIGGERS
82+
(
83+
SCHED_NAME VARCHAR(120) NOT NULL,
84+
TRIGGER_NAME VARCHAR(200) NOT NULL,
85+
TRIGGER_GROUP VARCHAR(200) NOT NULL,
86+
STR_PROP_1 VARCHAR(512) NULL,
87+
STR_PROP_2 VARCHAR(512) NULL,
88+
STR_PROP_3 VARCHAR(512) NULL,
89+
INT_PROP_1 INT NULL,
90+
INT_PROP_2 INT NULL,
91+
LONG_PROP_1 BIGINT NULL,
92+
LONG_PROP_2 BIGINT NULL,
93+
DEC_PROP_1 NUMERIC(13, 4) NULL,
94+
DEC_PROP_2 NUMERIC(13, 4) NULL,
95+
BOOL_PROP_1 BOOL NULL,
96+
BOOL_PROP_2 BOOL NULL,
97+
PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
98+
FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
99+
REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
100+
);
101+
102+
CREATE TABLE QRTZ_BLOB_TRIGGERS
103+
(
104+
SCHED_NAME VARCHAR(120) NOT NULL,
105+
TRIGGER_NAME VARCHAR(200) NOT NULL,
106+
TRIGGER_GROUP VARCHAR(200) NOT NULL,
107+
BLOB_DATA BYTEA NULL,
108+
PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP),
109+
FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
110+
REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP)
111+
);
112+
113+
CREATE TABLE QRTZ_CALENDARS
114+
(
115+
SCHED_NAME VARCHAR(120) NOT NULL,
116+
CALENDAR_NAME VARCHAR(200) NOT NULL,
117+
CALENDAR BYTEA NOT NULL,
118+
PRIMARY KEY (SCHED_NAME, CALENDAR_NAME)
119+
);
120+
121+
122+
CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS
123+
(
124+
SCHED_NAME VARCHAR(120) NOT NULL,
125+
TRIGGER_GROUP VARCHAR(200) NOT NULL,
126+
PRIMARY KEY (SCHED_NAME, TRIGGER_GROUP)
127+
);
128+
129+
CREATE TABLE QRTZ_FIRED_TRIGGERS
130+
(
131+
SCHED_NAME VARCHAR(120) NOT NULL,
132+
ENTRY_ID VARCHAR(95) NOT NULL,
133+
TRIGGER_NAME VARCHAR(200) NOT NULL,
134+
TRIGGER_GROUP VARCHAR(200) NOT NULL,
135+
INSTANCE_NAME VARCHAR(200) NOT NULL,
136+
FIRED_TIME BIGINT NOT NULL,
137+
SCHED_TIME BIGINT NOT NULL,
138+
PRIORITY INTEGER NOT NULL,
139+
STATE VARCHAR(16) NOT NULL,
140+
JOB_NAME VARCHAR(200) NULL,
141+
JOB_GROUP VARCHAR(200) NULL,
142+
IS_NONCONCURRENT BOOL NULL,
143+
REQUESTS_RECOVERY BOOL NULL,
144+
PRIMARY KEY (SCHED_NAME, ENTRY_ID)
145+
);
146+
147+
CREATE TABLE QRTZ_SCHEDULER_STATE
148+
(
149+
SCHED_NAME VARCHAR(120) NOT NULL,
150+
INSTANCE_NAME VARCHAR(200) NOT NULL,
151+
LAST_CHECKIN_TIME BIGINT NOT NULL,
152+
CHECKIN_INTERVAL BIGINT NOT NULL,
153+
PRIMARY KEY (SCHED_NAME, INSTANCE_NAME)
154+
);
155+
156+
CREATE TABLE QRTZ_LOCKS
157+
(
158+
SCHED_NAME VARCHAR(120) NOT NULL,
159+
LOCK_NAME VARCHAR(40) NOT NULL,
160+
PRIMARY KEY (SCHED_NAME, LOCK_NAME)
161+
);
162+
163+
CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY
164+
ON QRTZ_JOB_DETAILS (SCHED_NAME, REQUESTS_RECOVERY);
165+
CREATE INDEX IDX_QRTZ_J_GRP
166+
ON QRTZ_JOB_DETAILS (SCHED_NAME, JOB_GROUP);
167+
168+
CREATE INDEX IDX_QRTZ_T_J
169+
ON QRTZ_TRIGGERS (SCHED_NAME, JOB_NAME, JOB_GROUP);
170+
CREATE INDEX IDX_QRTZ_T_JG
171+
ON QRTZ_TRIGGERS (SCHED_NAME, JOB_GROUP);
172+
CREATE INDEX IDX_QRTZ_T_C
173+
ON QRTZ_TRIGGERS (SCHED_NAME, CALENDAR_NAME);
174+
CREATE INDEX IDX_QRTZ_T_G
175+
ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_GROUP);
176+
CREATE INDEX IDX_QRTZ_T_STATE
177+
ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_STATE);
178+
CREATE INDEX IDX_QRTZ_T_N_STATE
179+
ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, TRIGGER_STATE);
180+
CREATE INDEX IDX_QRTZ_T_N_G_STATE
181+
ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_GROUP, TRIGGER_STATE);
182+
CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME
183+
ON QRTZ_TRIGGERS (SCHED_NAME, NEXT_FIRE_TIME);
184+
CREATE INDEX IDX_QRTZ_T_NFT_ST
185+
ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_STATE, NEXT_FIRE_TIME);
186+
CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE
187+
ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME);
188+
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE
189+
ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_STATE);
190+
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP
191+
ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_GROUP, TRIGGER_STATE);
192+
193+
CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME
194+
ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, INSTANCE_NAME);
195+
CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY
196+
ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, INSTANCE_NAME, REQUESTS_RECOVERY);
197+
CREATE INDEX IDX_QRTZ_FT_J_G
198+
ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, JOB_NAME, JOB_GROUP);
199+
CREATE INDEX IDX_QRTZ_FT_JG
200+
ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, JOB_GROUP);
201+
CREATE INDEX IDX_QRTZ_FT_T_G
202+
ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP);
203+
CREATE INDEX IDX_QRTZ_FT_TG
204+
ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, TRIGGER_GROUP);
205+
206+
207+
COMMIT;

docker-compose.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
version: '3'
2+
3+
services:
4+
app:
5+
build: .
6+
environment:
7+
DB_URL: jdbc:postgresql://postgresql/twarc_test
8+
DB_USER: postgres
9+
DB_PASSWORD: postgres
10+
depends_on:
11+
- postgresql
12+
postgresql:
13+
image: postgres:12-alpine
14+
15+
environment:
16+
POSTGRES_PASSWORD: postgres
17+
POSTGRES_DB: twarc_test

project.clj

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
(defproject twarc "0.1.12"
22
:description "Doing Quartz the right way"
33
:url "https://github.com/prepor/twarc"
4-
:license {:name "Eclipse Public License"
4+
:license {:name "Eclipse Public License",
55
:url "http://www.eclipse.org/legal/epl-v10.html"}
6-
:dependencies [[org.clojure/clojure "1.6.0"]
7-
[org.quartz-scheduler/quartz "2.2.1"]
8-
[org.quartz-scheduler/quartz-jobs "2.2.1"]
9-
[org.clojure/tools.logging "0.3.1"]
10-
[com.stuartsierra/component "0.2.2"]
11-
[prismatic/plumbing "0.5.3"]
12-
[org.clojure/core.async "0.1.346.0-17112a-alpha"]]
6+
:dependencies [[org.clojure/clojure "1.10.1"]
7+
[org.quartz-scheduler/quartz "2.3.2"]
8+
[org.quartz-scheduler/quartz-jobs "2.3.2"]
9+
[org.clojure/tools.logging "1.0.0"]
10+
[com.stuartsierra/component "1.0.0"]
11+
[prismatic/plumbing "0.5.5"]
12+
[org.clojure/core.async "1.1.587"]
13+
[org.clojure/java.jdbc "0.7.11"]]
1314
:javac-options ["-source" "1.6" "-target" "1.6" "-g"]
1415
:java-source-paths ["java"]
1516
:deploy-repositories [["releases" :clojars]]
16-
:profiles {:dev {:dependencies [[org.slf4j/slf4j-api "1.7.7"]
17-
[ch.qos.logback/logback-classic "1.1.2"]
18-
[org.postgresql/postgresql "9.3-1102-jdbc41"]]}})
17+
:profiles {:dev {:dependencies [[org.slf4j/slf4j-api "1.7.30"]
18+
[ch.qos.logback/logback-classic "1.2.3"]
19+
[org.postgresql/postgresql "42.2.12"]]}})

test/twarc/test_utils.clj

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
(ns twarc.test-utils
22
(:require [twarc.core :as twarc]
3-
[clojure.core.async :as async])
3+
[clojure.core.async :as async]
4+
[clojure.java.jdbc :as sql]
5+
[clojure.java.io :as io])
46
(:import [org.quartz JobKey]))
57

68

@@ -11,13 +13,60 @@
1113
(async/timeout (* seconds 5000)) (throw (Exception. "Timeout"))
1214
ch ([v ch] v))))
1315

16+
17+
(def pg-db {:connection-uri (System/getenv "DB_URL")
18+
:user (System/getenv "DB_USER")
19+
:password (System/getenv "DB_PASSWORD")})
20+
21+
22+
(defn db-available? []
23+
(->> pg-db vals (every? some?)))
24+
25+
26+
(defn exec-sql-file
27+
[resource]
28+
(sql/db-do-prepared pg-db
29+
(-> resource
30+
io/resource
31+
slurp)))
32+
33+
1434
(def ^:dynamic *scheduler*)
1535

16-
(defn with-scheduler
17-
[f]
18-
(binding [*scheduler* (-> (twarc/make-scheduler {:threadPool.threadCount 1})
19-
(twarc/start))]
36+
37+
(def props
38+
{:threadPool.class "org.quartz.simpl.SimpleThreadPool"
39+
:threadPool.threadCount 1
40+
:plugin.triggHistory.class
41+
"org.quartz.plugins.history.LoggingTriggerHistoryPlugin"
42+
43+
:plugin.jobHistory.class
44+
"org.quartz.plugins.history.LoggingJobHistoryPlugin"})
45+
46+
47+
(def persistent-props
48+
(assoc props
49+
:jobStore.class "org.quartz.impl.jdbcjobstore.JobStoreTX"
50+
:jobStore.dataSource "db"
51+
:dataSource.db.driver "org.postgresql.Driver"
52+
:dataSource.db.URL (:connection-uri pg-db)
53+
:dataSource.db.user (:user pg-db)
54+
:dataSource.db.password (:password pg-db)
55+
:jobStore.driverDelegateClass
56+
"org.quartz.impl.jdbcjobstore.PostgreSQLDelegate"))
57+
58+
59+
(defn run-with-scheduler [f scheduler]
60+
(binding [*scheduler* (twarc/start scheduler)]
2061
(try
2162
(f)
2263
(finally
2364
(twarc/stop *scheduler*)))))
65+
66+
67+
(defn with-scheduler
68+
[f]
69+
(when (db-available?)
70+
(exec-sql-file "tables_postgres.sql")
71+
(run-with-scheduler f (twarc/make-scheduler persistent-props)))
72+
(run-with-scheduler f (twarc/make-scheduler props)))

0 commit comments

Comments
 (0)