From ecb62ca8646a21582e39e5b36cd16f86f315452e Mon Sep 17 00:00:00 2001 From: x7airworker Date: Sat, 19 Aug 2023 01:31:10 +0200 Subject: [PATCH 1/7] Bump http-server version --- pom.xml | 2 +- src/main/java/org/javawebstack/jobs/api/JobApi.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index c3fe7cc..ec6d810 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ org.javawebstack http-server - 1.0.1 + 1.0.3-SNAPSHOT org.javawebstack diff --git a/src/main/java/org/javawebstack/jobs/api/JobApi.java b/src/main/java/org/javawebstack/jobs/api/JobApi.java index 8db32d0..0c9d6bc 100644 --- a/src/main/java/org/javawebstack/jobs/api/JobApi.java +++ b/src/main/java/org/javawebstack/jobs/api/JobApi.java @@ -1,8 +1,8 @@ package org.javawebstack.jobs.api; import lombok.Getter; +import org.javawebstack.httpserver.HTTPMethod; import org.javawebstack.httpserver.HTTPServer; -import org.javawebstack.httpserver.helper.HttpMethod; import org.javawebstack.httpserver.transformer.response.JsonResponseTransformer; import org.javawebstack.jobs.Jobs; import org.javawebstack.jobs.api.auth.AuthProvider; @@ -51,7 +51,7 @@ public HTTPServer start(int port) { ex.header("Access-Control-Allow-Origin", "*"); ex.header("Access-Control-Allow-Methods", "*"); ex.header("Access-Control-Allow-Headers", "*"); - if(ex.getMethod() == HttpMethod.OPTIONS) { + if(ex.getMethod() == HTTPMethod.OPTIONS) { ex.close(); return true; } From c3b13905c8c09c58f9ead9a536562ebd378ba6e2 Mon Sep 17 00:00:00 2001 From: x7airworker Date: Sat, 19 Aug 2023 02:50:01 +0200 Subject: [PATCH 2/7] Added missing ossrh repository to maven pom.xml --- pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pom.xml b/pom.xml index ec6d810..0d9d415 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,13 @@ https://github.com/JavaWebStack/jobs/tree/master + + + ossrh + https://s01.oss.sonatype.org/content/repositories/snapshots + + + org.javawebstack From e06abb42b9f661c3af8e8b8ec9c850ce8df04201 Mon Sep 17 00:00:00 2001 From: JanHolger Date: Wed, 20 Sep 2023 22:06:39 +0200 Subject: [PATCH 3/7] Upgraded to latest JWS snapshot versions --- pom.xml | 21 +- .../org/javawebstack/jobs/api/JobApi.java | 29 +- .../jobs/api/controller/ErrorController.java | 4 +- .../jobs/api/controller/JobController.java | 18 +- .../controller/RecurringJobController.java | 23 +- .../jobs/api/controller/StatusController.java | 6 +- .../jobs/api/controller/WorkerController.java | 6 +- .../jobs/api/middleware/AuthMiddleware.java | 4 +- .../api/middleware/ResponseMiddleware.java | 4 +- .../jobs/scheduler/sql/SQLJobScheduler.java | 91 +++--- .../jobs/standalone/StandaloneOptions.java | 10 +- .../jobs/storage/model/PaginationQuery.java | 3 +- .../jobs/storage/sql/SQLJobStorage.java | 281 ++++++++++-------- .../org/javawebstack/jobs/util/SQLUtil.java | 2 +- .../scheduler/sql/SQLJobSchedulerTest.java | 13 +- .../jobs/test/TestProperties.java | 12 +- .../org/javawebstack/jobs/test/TestUtil.java | 17 +- 17 files changed, 308 insertions(+), 236 deletions(-) diff --git a/pom.xml b/pom.xml index 0d9d415..fa70a51 100644 --- a/pom.xml +++ b/pom.xml @@ -51,29 +51,34 @@ org.javawebstack abstract-data - 1.0.4 + 1.0.6 org.javawebstack - http-server + http-router 1.0.3-SNAPSHOT + + org.javawebstack + http-router-undertow + 1.0.0-SNAPSHOT + org.javawebstack orm - 1.0.1 + 1.0.3-SNAPSHOT true redis.clients jedis - 4.3.0-m1 + 5.0.0 true org.projectlombok lombok - 1.18.24 + 1.18.28 provided @@ -89,19 +94,19 @@ org.junit.jupiter junit-jupiter-engine - 5.9.0 + 5.10.0 test org.junit.jupiter junit-jupiter-api - 5.9.0 + 5.10.0 test mysql mysql-connector-java - 8.0.30 + 8.0.32 test diff --git a/src/main/java/org/javawebstack/jobs/api/JobApi.java b/src/main/java/org/javawebstack/jobs/api/JobApi.java index 0c9d6bc..d5e7080 100644 --- a/src/main/java/org/javawebstack/jobs/api/JobApi.java +++ b/src/main/java/org/javawebstack/jobs/api/JobApi.java @@ -1,9 +1,10 @@ package org.javawebstack.jobs.api; import lombok.Getter; -import org.javawebstack.httpserver.HTTPMethod; -import org.javawebstack.httpserver.HTTPServer; -import org.javawebstack.httpserver.transformer.response.JsonResponseTransformer; +import org.javawebstack.http.router.HTTPMethod; +import org.javawebstack.http.router.HTTPRouter; +import org.javawebstack.http.router.transformer.response.JsonResponseTransformer; +import org.javawebstack.http.router.undertow.UndertowHTTPSocketServer; import org.javawebstack.jobs.Jobs; import org.javawebstack.jobs.api.auth.AuthProvider; import org.javawebstack.jobs.api.controller.*; @@ -41,13 +42,13 @@ public JobApi dashboard(boolean enableDashboard) { return this; } - public HTTPServer start(int port) { - HTTPServer server = new HTTPServer() + public HTTPRouter start(int port) { + HTTPRouter router = new HTTPRouter(new UndertowHTTPSocketServer()) .responseTransformer(new JsonResponseTransformer().ignoreStrings()) .port(port); - install(server, null); - server.start(); - server.beforeInterceptor(ex -> { + install(router, null); + router.start(); + router.beforeInterceptor(ex -> { ex.header("Access-Control-Allow-Origin", "*"); ex.header("Access-Control-Allow-Methods", "*"); ex.header("Access-Control-Allow-Headers", "*"); @@ -57,15 +58,15 @@ public HTTPServer start(int port) { } return false; }); - return server; + return router; } - public JobApi install(HTTPServer server, String prefix) { + public JobApi install(HTTPRouter router, String prefix) { if(prefix == null) prefix = ""; if(prefix.length() > 0 && enableDashboard) throw new IllegalArgumentException("Prefix can not be set when the dashboard is enabled!"); - server + router .exceptionHandler(new ErrorController()) .controller(prefix, new JobController(jobs)) .controller(prefix, new RecurringJobController(jobs)) @@ -74,13 +75,13 @@ public JobApi install(HTTPServer server, String prefix) { .afterAny(prefix + "{*:path}", new ResponseMiddleware()) .middleware("jobs_auth", new AuthMiddleware(this)); if(enableDashboard) { - server.get("/", ex -> { + router.get("/", ex -> { ex.redirect("/overview"); return ""; }); - server.staticResourceDirectory(prefix, JobApi.class.getClassLoader(), "dashboard"); + router.staticResourceDirectory(prefix, JobApi.class.getClassLoader(), "dashboard"); String html = loadHtml(); - server.get(prefix + "{*:path}", ex -> html); + router.get(prefix + "{*:path}", ex -> html); } // TODO install dashboard return this; diff --git a/src/main/java/org/javawebstack/jobs/api/controller/ErrorController.java b/src/main/java/org/javawebstack/jobs/api/controller/ErrorController.java index 71101f0..f2123b7 100644 --- a/src/main/java/org/javawebstack/jobs/api/controller/ErrorController.java +++ b/src/main/java/org/javawebstack/jobs/api/controller/ErrorController.java @@ -3,8 +3,8 @@ import org.javawebstack.abstractdata.AbstractArray; import org.javawebstack.abstractdata.AbstractObject; import org.javawebstack.abstractdata.AbstractPrimitive; -import org.javawebstack.httpserver.Exchange; -import org.javawebstack.httpserver.handler.ExceptionHandler; +import org.javawebstack.http.router.Exchange; +import org.javawebstack.http.router.handler.ExceptionHandler; import org.javawebstack.jobs.api.response.Response; import org.javawebstack.validator.ValidationError; import org.javawebstack.validator.ValidationException; diff --git a/src/main/java/org/javawebstack/jobs/api/controller/JobController.java b/src/main/java/org/javawebstack/jobs/api/controller/JobController.java index 66c9987..9280ea0 100644 --- a/src/main/java/org/javawebstack/jobs/api/controller/JobController.java +++ b/src/main/java/org/javawebstack/jobs/api/controller/JobController.java @@ -2,14 +2,14 @@ import org.javawebstack.abstractdata.AbstractElement; import org.javawebstack.abstractdata.AbstractObject; -import org.javawebstack.httpserver.Exchange; -import org.javawebstack.httpserver.router.annotation.PathPrefix; -import org.javawebstack.httpserver.router.annotation.With; -import org.javawebstack.httpserver.router.annotation.params.Body; -import org.javawebstack.httpserver.router.annotation.params.Path; -import org.javawebstack.httpserver.router.annotation.verbs.Delete; -import org.javawebstack.httpserver.router.annotation.verbs.Get; -import org.javawebstack.httpserver.router.annotation.verbs.Post; +import org.javawebstack.http.router.Exchange; +import org.javawebstack.http.router.router.annotation.PathPrefix; +import org.javawebstack.http.router.router.annotation.With; +import org.javawebstack.http.router.router.annotation.params.Body; +import org.javawebstack.http.router.router.annotation.params.Path; +import org.javawebstack.http.router.router.annotation.verbs.Delete; +import org.javawebstack.http.router.router.annotation.verbs.Get; +import org.javawebstack.http.router.router.annotation.verbs.Post; import org.javawebstack.jobs.JobStatus; import org.javawebstack.jobs.Jobs; import org.javawebstack.jobs.api.request.CreateJobRequest; @@ -73,7 +73,7 @@ public Response get(@Path("id") UUID id, Exchange exchange) { JobInfo info = storage.getJob(id); if(info == null) return Response.error(404, "Job not found"); - AbstractObject res = exchange.getServer().getAbstractMapper().toAbstract(info).object(); + AbstractObject res = exchange.getRouter().getMapper().map(info).object(); if(exchange.getQueryParameters().has("payload") && (exchange.query("payload").length() == 0 || exchange.query("payload").equals("true"))) res.set("payload", AbstractElement.fromJson(storage.getJobPayload(info.getId()))); return Response.success().setData(res); diff --git a/src/main/java/org/javawebstack/jobs/api/controller/RecurringJobController.java b/src/main/java/org/javawebstack/jobs/api/controller/RecurringJobController.java index 2b9cd73..909b5a2 100644 --- a/src/main/java/org/javawebstack/jobs/api/controller/RecurringJobController.java +++ b/src/main/java/org/javawebstack/jobs/api/controller/RecurringJobController.java @@ -1,21 +1,18 @@ package org.javawebstack.jobs.api.controller; -import org.javawebstack.abstractdata.AbstractElement; import org.javawebstack.abstractdata.AbstractObject; -import org.javawebstack.httpserver.Exchange; -import org.javawebstack.httpserver.router.annotation.PathPrefix; -import org.javawebstack.httpserver.router.annotation.With; -import org.javawebstack.httpserver.router.annotation.params.Body; -import org.javawebstack.httpserver.router.annotation.params.Path; -import org.javawebstack.httpserver.router.annotation.verbs.Delete; -import org.javawebstack.httpserver.router.annotation.verbs.Get; -import org.javawebstack.httpserver.router.annotation.verbs.Post; -import org.javawebstack.jobs.JobStatus; + +import org.javawebstack.http.router.Exchange; +import org.javawebstack.http.router.router.annotation.PathPrefix; +import org.javawebstack.http.router.router.annotation.With; +import org.javawebstack.http.router.router.annotation.params.Body; +import org.javawebstack.http.router.router.annotation.params.Path; +import org.javawebstack.http.router.router.annotation.verbs.Delete; +import org.javawebstack.http.router.router.annotation.verbs.Get; +import org.javawebstack.http.router.router.annotation.verbs.Post; import org.javawebstack.jobs.Jobs; -import org.javawebstack.jobs.api.request.CreateJobRequest; import org.javawebstack.jobs.api.request.CreateRecurringJobRequest; import org.javawebstack.jobs.api.response.Response; -import org.javawebstack.jobs.storage.model.JobInfo; import org.javawebstack.jobs.storage.model.RecurringJobInfo; import org.javawebstack.jobs.storage.model.RecurringJobQuery; @@ -53,7 +50,7 @@ public Response get(@Path("id") UUID id, Exchange exchange) { RecurringJobInfo info = storage.getRecurringJob(id); if(info == null) return Response.error(404, "Recurring job not found"); - AbstractObject res = exchange.getServer().getAbstractMapper().toAbstract(info).object(); + AbstractObject res = exchange.getRouter().getMapper().map(info).object(); return Response.success().setData(res); } diff --git a/src/main/java/org/javawebstack/jobs/api/controller/StatusController.java b/src/main/java/org/javawebstack/jobs/api/controller/StatusController.java index 0a6587f..7f7fe35 100644 --- a/src/main/java/org/javawebstack/jobs/api/controller/StatusController.java +++ b/src/main/java/org/javawebstack/jobs/api/controller/StatusController.java @@ -1,8 +1,8 @@ package org.javawebstack.jobs.api.controller; -import org.javawebstack.httpserver.router.annotation.PathPrefix; -import org.javawebstack.httpserver.router.annotation.With; -import org.javawebstack.httpserver.router.annotation.verbs.Get; +import org.javawebstack.http.router.router.annotation.PathPrefix; +import org.javawebstack.http.router.router.annotation.With; +import org.javawebstack.http.router.router.annotation.verbs.Get; import org.javawebstack.jobs.Job; import org.javawebstack.jobs.Jobs; import org.javawebstack.jobs.api.response.Response; diff --git a/src/main/java/org/javawebstack/jobs/api/controller/WorkerController.java b/src/main/java/org/javawebstack/jobs/api/controller/WorkerController.java index b71a498..f81e2ad 100644 --- a/src/main/java/org/javawebstack/jobs/api/controller/WorkerController.java +++ b/src/main/java/org/javawebstack/jobs/api/controller/WorkerController.java @@ -1,8 +1,8 @@ package org.javawebstack.jobs.api.controller; -import org.javawebstack.httpserver.router.annotation.PathPrefix; -import org.javawebstack.httpserver.router.annotation.With; -import org.javawebstack.httpserver.router.annotation.verbs.Get; +import org.javawebstack.http.router.router.annotation.PathPrefix; +import org.javawebstack.http.router.router.annotation.With; +import org.javawebstack.http.router.router.annotation.verbs.Get; import org.javawebstack.jobs.Jobs; import org.javawebstack.jobs.api.response.Response; diff --git a/src/main/java/org/javawebstack/jobs/api/middleware/AuthMiddleware.java b/src/main/java/org/javawebstack/jobs/api/middleware/AuthMiddleware.java index 03face5..16918ef 100644 --- a/src/main/java/org/javawebstack/jobs/api/middleware/AuthMiddleware.java +++ b/src/main/java/org/javawebstack/jobs/api/middleware/AuthMiddleware.java @@ -1,8 +1,8 @@ package org.javawebstack.jobs.api.middleware; import lombok.AllArgsConstructor; -import org.javawebstack.httpserver.Exchange; -import org.javawebstack.httpserver.handler.RequestHandler; +import org.javawebstack.http.router.Exchange; +import org.javawebstack.http.router.handler.RequestHandler; import org.javawebstack.jobs.api.JobApi; import org.javawebstack.jobs.api.response.Response; diff --git a/src/main/java/org/javawebstack/jobs/api/middleware/ResponseMiddleware.java b/src/main/java/org/javawebstack/jobs/api/middleware/ResponseMiddleware.java index 05ee005..26f4afd 100644 --- a/src/main/java/org/javawebstack/jobs/api/middleware/ResponseMiddleware.java +++ b/src/main/java/org/javawebstack/jobs/api/middleware/ResponseMiddleware.java @@ -1,7 +1,7 @@ package org.javawebstack.jobs.api.middleware; -import org.javawebstack.httpserver.Exchange; -import org.javawebstack.httpserver.handler.AfterRequestHandler; +import org.javawebstack.http.router.Exchange; +import org.javawebstack.http.router.handler.AfterRequestHandler; import org.javawebstack.jobs.api.response.Response; public class ResponseMiddleware implements AfterRequestHandler { diff --git a/src/main/java/org/javawebstack/jobs/scheduler/sql/SQLJobScheduler.java b/src/main/java/org/javawebstack/jobs/scheduler/sql/SQLJobScheduler.java index c342118..8dc2552 100644 --- a/src/main/java/org/javawebstack/jobs/scheduler/sql/SQLJobScheduler.java +++ b/src/main/java/org/javawebstack/jobs/scheduler/sql/SQLJobScheduler.java @@ -4,7 +4,8 @@ import org.javawebstack.jobs.scheduler.model.JobScheduleEntry; import org.javawebstack.jobs.util.MapBuilder; import org.javawebstack.jobs.util.SQLUtil; -import org.javawebstack.orm.wrapper.SQL; +import org.javawebstack.orm.connection.pool.PooledSQL; +import org.javawebstack.orm.connection.pool.SQLPool; import java.sql.SQLException; import java.time.Instant; @@ -13,15 +14,15 @@ public class SQLJobScheduler implements JobScheduler { - final SQL sql; + final SQLPool pool; final String tablePrefix; - public SQLJobScheduler(SQL sql, String tablePrefix) { + public SQLJobScheduler(SQLPool pool, String tablePrefix) { if(tablePrefix == null) tablePrefix = ""; - this.sql = sql; + this.pool = pool; this.tablePrefix = tablePrefix; - try { + try(PooledSQL sql = pool.get()) { sql.write("CREATE TABLE IF NOT EXISTS `" + table("queued_jobs") + "` (`id` VARCHAR(36), `ord` BIGINT, `queue` VARCHAR(50) NOT NULL, `job_id` VARCHAR(36) NOT NULL, `created_at` TIMESTAMP NOT NULL, PRIMARY KEY(`id`));"); sql.write("CREATE TABLE IF NOT EXISTS `" + table("scheduled_jobs") + "` (`id` VARCHAR(36), `ord` BIGINT, `queue` VARCHAR(50) NOT NULL, `job_id` VARCHAR(36) NOT NULL, `scheduled_at` TIMESTAMP NOT NULL, `created_at` TIMESTAMP NOT NULL, PRIMARY KEY(`id`));"); } catch (SQLException e) { @@ -34,53 +35,65 @@ private String table(String name) { } public void enqueue(String queue, UUID id) { - SQLUtil.insert(sql, table("queued_jobs"), new MapBuilder() - .set("id", UUID.randomUUID()) - .set("ord", System.currentTimeMillis()) - .set("queue", queue) - .set("job_id", id) - .set("created_at", Date.from(Instant.now())) - .build() - ); + try(PooledSQL sql = pool.get()) { + SQLUtil.insert(sql, table("queued_jobs"), new MapBuilder() + .set("id", UUID.randomUUID()) + .set("ord", System.currentTimeMillis()) + .set("queue", queue) + .set("job_id", id) + .set("created_at", Date.from(Instant.now())) + .build() + ); + } } public void dequeue(UUID id) { - SQLUtil.delete(sql, table("queued_jobs"), "`id`=?", id); + try(PooledSQL sql = pool.get()) { + SQLUtil.delete(sql, table("queued_jobs"), "`id`=?", id); + } } public void schedule(String queue, Date at, UUID id) { - SQLUtil.insert(sql, table("scheduled_jobs"), new MapBuilder() - .set("id", UUID.randomUUID()) - .set("ord", System.currentTimeMillis()) - .set("queue", queue) - .set("job_id", id) - .set("scheduled_at", at) - .set("created_at", Date.from(Instant.now())) - .build() - ); + try(PooledSQL sql = pool.get()) { + SQLUtil.insert(sql, table("scheduled_jobs"), new MapBuilder() + .set("id", UUID.randomUUID()) + .set("ord", System.currentTimeMillis()) + .set("queue", queue) + .set("job_id", id) + .set("scheduled_at", at) + .set("created_at", Date.from(Instant.now())) + .build() + ); + } } public synchronized UUID poll(String queue) { - Map e = SQLUtil.select(sql, table("queued_jobs"), "`id`,`job_id`", "WHERE `queue`=? ORDER BY `ord` LIMIT 1", queue).stream().findFirst().orElse(null); - if(e == null) - return null; - SQLUtil.delete(sql, table("queued_jobs"), "`id`=?", e.get("id")); - return UUID.fromString((String) e.get("job_id")); + try(PooledSQL sql = pool.get()) { + Map e = SQLUtil.select(sql, table("queued_jobs"), "`id`,`job_id`", "WHERE `queue`=? ORDER BY `ord` LIMIT 1", queue).stream().findFirst().orElse(null); + if(e == null) + return null; + SQLUtil.delete(sql, table("queued_jobs"), "`id`=?", e.get("id")); + return UUID.fromString((String) e.get("job_id")); + } } public List processSchedule(String queue) { List enqueued = new ArrayList<>(); - SQLUtil.select(sql, table("scheduled_jobs"), "`id`,`job_id`", "WHERE `queue`=? AND `scheduled_at`<=? ORDER BY `ord`", queue, Date.from(Instant.now())).forEach(e -> { - UUID jobId = UUID.fromString((String) e.get("job_id")); - enqueue(queue, jobId); - enqueued.add(jobId); - SQLUtil.delete(sql, table("scheduled_jobs"), "`id`=?", e.get("id")); - }); + try(PooledSQL sql = pool.get()) { + SQLUtil.select(sql, table("scheduled_jobs"), "`id`,`job_id`", "WHERE `queue`=? AND `scheduled_at`<=? ORDER BY `ord`", queue, Date.from(Instant.now())).forEach(e -> { + UUID jobId = UUID.fromString((String) e.get("job_id")); + enqueue(queue, jobId); + enqueued.add(jobId); + SQLUtil.delete(sql, table("scheduled_jobs"), "`id`=?", e.get("id")); + }); + } return enqueued; } public List getScheduleEntries(String queue) { - return SQLUtil.select(sql, table("scheduled_jobs"), "`job_id`,`scheduled_at`", "WHERE `queue`=? ORDER BY `ord`", queue).stream().map(this::buildScheduleEntry).collect(Collectors.toList()); + try(PooledSQL sql = pool.get()) { + return SQLUtil.select(sql, table("scheduled_jobs"), "`job_id`,`scheduled_at`", "WHERE `queue`=? ORDER BY `ord`", queue).stream().map(this::buildScheduleEntry).collect(Collectors.toList()); + } } public List getScheduleEntries(List jobIds) { @@ -88,11 +101,15 @@ public List getScheduleEntries(List jobIds) { return Collections.emptyList(); String whereIn = jobIds.stream().map(UUID::toString).map(s -> "\"" + s + "\"").collect(Collectors.joining(",")); - return SQLUtil.select(sql, table("scheduled_jobs"), "`job_id`,`scheduled_at`", "WHERE `job_id` IN (" + whereIn + ") ORDER BY `ord`").stream().map(this::buildScheduleEntry).collect(Collectors.toList()); + try(PooledSQL sql = pool.get()) { + return SQLUtil.select(sql, table("scheduled_jobs"), "`job_id`,`scheduled_at`", "WHERE `job_id` IN (" + whereIn + ") ORDER BY `ord`").stream().map(this::buildScheduleEntry).collect(Collectors.toList()); + } } public List getQueueEntries(String queue) { - return SQLUtil.select(sql, table("queued_jobs"), "`job_id`", "WHERE `queue`=? ORDER BY `ord`", queue).stream().map(e -> UUID.fromString((String) e.get("job_id"))).collect(Collectors.toList()); + try(PooledSQL sql = pool.get()) { + return SQLUtil.select(sql, table("queued_jobs"), "`job_id`", "WHERE `queue`=? ORDER BY `ord`", queue).stream().map(e -> UUID.fromString((String) e.get("job_id"))).collect(Collectors.toList()); + } } private JobScheduleEntry buildScheduleEntry(Map values) { diff --git a/src/main/java/org/javawebstack/jobs/standalone/StandaloneOptions.java b/src/main/java/org/javawebstack/jobs/standalone/StandaloneOptions.java index e3b36ab..2e747df 100644 --- a/src/main/java/org/javawebstack/jobs/standalone/StandaloneOptions.java +++ b/src/main/java/org/javawebstack/jobs/standalone/StandaloneOptions.java @@ -9,7 +9,9 @@ import org.javawebstack.jobs.storage.JobStorage; import org.javawebstack.jobs.storage.inmemory.InMemoryJobStorage; import org.javawebstack.jobs.storage.sql.SQLJobStorage; -import org.javawebstack.orm.wrapper.MySQL; +import org.javawebstack.orm.connection.MySQL; +import org.javawebstack.orm.connection.pool.MinMaxScaler; +import org.javawebstack.orm.connection.pool.SQLPool; import java.util.HashMap; import java.util.Locale; @@ -82,14 +84,14 @@ public boolean isEnabled(String key, boolean orElse) { } } - private MySQL getMySQL() { - return new MySQL( + private SQLPool getMySQL() { + return new SQLPool(new MinMaxScaler(1,1), () -> new MySQL( get("db.host", "127.0.0.1"), getInt("db.port", 3306), get("db.name", "jobs"), get("db.username", "jobs"), get("db.password", "") - ); + )); } public JobSerializer getSerializer() { diff --git a/src/main/java/org/javawebstack/jobs/storage/model/PaginationQuery.java b/src/main/java/org/javawebstack/jobs/storage/model/PaginationQuery.java index a66dff2..10523b1 100644 --- a/src/main/java/org/javawebstack/jobs/storage/model/PaginationQuery.java +++ b/src/main/java/org/javawebstack/jobs/storage/model/PaginationQuery.java @@ -1,6 +1,7 @@ package org.javawebstack.jobs.storage.model; -import org.javawebstack.httpserver.Exchange; + +import org.javawebstack.http.router.Exchange; public abstract class PaginationQuery> { diff --git a/src/main/java/org/javawebstack/jobs/storage/sql/SQLJobStorage.java b/src/main/java/org/javawebstack/jobs/storage/sql/SQLJobStorage.java index 631c0a7..39889f8 100644 --- a/src/main/java/org/javawebstack/jobs/storage/sql/SQLJobStorage.java +++ b/src/main/java/org/javawebstack/jobs/storage/sql/SQLJobStorage.java @@ -7,7 +7,8 @@ import org.javawebstack.jobs.storage.JobStorage; import org.javawebstack.jobs.util.MapBuilder; import org.javawebstack.jobs.util.SQLUtil; -import org.javawebstack.orm.wrapper.SQL; +import org.javawebstack.orm.connection.pool.PooledSQL; +import org.javawebstack.orm.connection.pool.SQLPool; import java.sql.SQLException; import java.time.Instant; @@ -18,15 +19,15 @@ public class SQLJobStorage implements JobStorage { - final SQL sql; + final SQLPool pool; final String tablePrefix; - public SQLJobStorage(SQL sql, String tablePrefix) { + public SQLJobStorage(SQLPool pool, String tablePrefix) { if(tablePrefix == null) tablePrefix = ""; - this.sql = sql; + this.pool = pool; this.tablePrefix = tablePrefix; - try { + try(PooledSQL sql = pool.get()) { sql.write("CREATE TABLE IF NOT EXISTS `" + table("jobs") + "` (`id` VARCHAR(36), `ord` BIGINT, `status` ENUM('CREATED', 'SCHEDULED', 'ENQUEUED', 'PROCESSING', 'SUCCESS', 'FAILED', 'DELETED'), `type` VARCHAR(100) NOT NULL, `payload` LONGTEXT NOT NULL, `created_at` TIMESTAMP NOT NULL, PRIMARY KEY(`id`));"); sql.write("CREATE TABLE IF NOT EXISTS `" + table("job_events") + "` (`id` VARCHAR(36), `ord` BIGINT, `job_id` VARCHAR(36) NOT NULL, `type` ENUM('SCHEDULED','ENQUEUED','PROCESSING','FAILED','SUCCESS') NOT NULL, `created_at` TIMESTAMP NOT NULL, PRIMARY KEY(`id`));"); sql.write("CREATE TABLE IF NOT EXISTS `" + table("job_log_entries") + "` (`id` VARCHAR(36), `ord` BIGINT, `event_id` VARCHAR(36) NOT NULL,`level` ENUM('INFO','WARNING','ERROR') NOT NULL, `message` LONGTEXT NOT NULL, `created_at` TIMESTAMP NOT NULL, PRIMARY KEY(`id`));"); @@ -44,15 +45,17 @@ private String table(String name) { public void createJob(JobInfo info, String payload) { JobStorage.super.createJob(info, payload); - SQLUtil.insert(sql, table("jobs"), new MapBuilder() - .set("id", info.getId()) - .set("ord", System.currentTimeMillis()) - .set("status", info.getStatus()) - .set("type", info.getType()) - .set("payload", payload) - .set("created_at", info.getCreatedAt()) - .build() - ); + try(PooledSQL sql = pool.get()) { + SQLUtil.insert(sql, table("jobs"), new MapBuilder() + .set("id", info.getId()) + .set("ord", System.currentTimeMillis()) + .set("status", info.getStatus()) + .set("type", info.getType()) + .set("payload", payload) + .set("created_at", info.getCreatedAt()) + .build() + ); + } } public boolean createRecurringJob(RecurringJobInfo info) { @@ -62,58 +65,72 @@ public boolean createRecurringJob(RecurringJobInfo info) { if (recurringJobs.stream().anyMatch(r -> r.getPayload().equals(info.getPayload()) && r.getCron().equals(info.getCron()))) return false; - SQLUtil.insert(sql, table("recurring_jobs"), new MapBuilder() - .set("id", info.getId()) - .set("last_job_id", info.getLastJobId()) - .set("queue", info.getQueue()) - .set("payload", info.getPayload()) - .set("type", info.getType()) - .set("ord", System.currentTimeMillis()) - .set("cron_expression", info.getCron().serialize()) - .set("created_at", new Date()) - .set("last_execution_at", info.getLastExecutionAt()) - .build() - ); + try(PooledSQL sql = pool.get()) { + SQLUtil.insert(sql, table("recurring_jobs"), new MapBuilder() + .set("id", info.getId()) + .set("last_job_id", info.getLastJobId()) + .set("queue", info.getQueue()) + .set("payload", info.getPayload()) + .set("type", info.getType()) + .set("ord", System.currentTimeMillis()) + .set("cron_expression", info.getCron().serialize()) + .set("created_at", new Date()) + .set("last_execution_at", info.getLastExecutionAt()) + .build() + ); + } return true; } public JobInfo getJob(UUID id) { - List> results = SQLUtil.select(sql, table("jobs"), "`id`,`status`,`type`,`created_at`", "WHERE `id`=? LIMIT 1", id); - if(results.size() == 0) - return null; - return buildJobInfo(results.get(0)); + try(PooledSQL sql = pool.get()) { + List> results = SQLUtil.select(sql, table("jobs"), "`id`,`status`,`type`,`created_at`", "WHERE `id`=? LIMIT 1", id); + if(results.isEmpty()) + return null; + return buildJobInfo(results.get(0)); + } } public RecurringJobInfo getRecurringJob(UUID id) { - List> results = SQLUtil.select(sql, table("recurring_jobs"), "`id`,`last_job_id`,`queue`,`payload`,`type`,`cron_expression`,`last_execution_at`,`created_at`", "WHERE `id`=? LIMIT 1", id); - if (results.size() == 0) - return null; - return buildRecurringJobInfo(results.get(0)); + try(PooledSQL sql = pool.get()) { + List> results = SQLUtil.select(sql, table("recurring_jobs"), "`id`,`last_job_id`,`queue`,`payload`,`type`,`cron_expression`,`last_execution_at`,`created_at`", "WHERE `id`=? LIMIT 1", id); + if (results.isEmpty()) + return null; + return buildRecurringJobInfo(results.get(0)); + } } public String getJobPayload(UUID id) { - List> results = SQLUtil.select(sql, table("jobs"), "`payload`", "WHERE `id`=? LIMIT 1", id); - if(results.size() == 0) - return null; - return (String) results.get(0).get("payload"); + try(PooledSQL sql = pool.get()) { + List> results = SQLUtil.select(sql, table("jobs"), "`payload`", "WHERE `id`=? LIMIT 1", id); + if(results.isEmpty()) + return null; + return (String) results.get(0).get("payload"); + } } public void setJobStatus(UUID id, JobStatus status) { - SQLUtil.update(sql, table("jobs"), new MapBuilder() - .set("status", status) - .build() - ,"`id`=?", id); + try(PooledSQL sql = pool.get()) { + SQLUtil.update(sql, table("jobs"), new MapBuilder() + .set("status", status) + .build() + ,"`id`=?", id); + } } public void deleteJob(UUID id) { - SQLUtil.delete(sql, table("job_log_entries"), "EXISTS(SELECT `id` FROM `" + table("job_events") + "` WHERE `" + table("job_events") + "`.id=`" + table("job_log_entries") + "`.event_id AND `" + table("job_events") + "`.job_id=?)", id); - SQLUtil.delete(sql, table("job_events"), "`job_id`=?", id); - SQLUtil.delete(sql, table("jobs"), "`id`=?", id); + try(PooledSQL sql = pool.get()) { + SQLUtil.delete(sql, table("job_log_entries"), "EXISTS(SELECT `id` FROM `" + table("job_events") + "` WHERE `" + table("job_events") + "`.id=`" + table("job_log_entries") + "`.event_id AND `" + table("job_events") + "`.job_id=?)", id); + SQLUtil.delete(sql, table("job_events"), "`job_id`=?", id); + SQLUtil.delete(sql, table("jobs"), "`id`=?", id); + } } public void deleteRecurringJob(UUID id) { - SQLUtil.delete(sql, table("recurring_jobs"), "`id`=?", id); + try(PooledSQL sql = pool.get()) { + SQLUtil.delete(sql, table("recurring_jobs"), "`id`=?", id); + } } public List queryJobs(JobQuery query) { @@ -146,10 +163,12 @@ public List queryJobs(JobQuery query) { limit = Integer.MAX_VALUE; sb.append(" LIMIT ").append(offset).append(",").append(limit); } - return SQLUtil.select(sql, table("jobs"), "`id`,`status`,`type`,`created_at`", sb.toString().trim(), params.toArray()) - .stream() - .map(this::buildJobInfo) - .collect(Collectors.toList()); + try(PooledSQL sql = pool.get()) { + return SQLUtil.select(sql, table("jobs"), "`id`,`status`,`type`,`created_at`", sb.toString().trim(), params.toArray()) + .stream() + .map(this::buildJobInfo) + .collect(Collectors.toList()); + } } public List queryRecurringJobs(RecurringJobQuery query) { @@ -185,122 +204,152 @@ public List queryRecurringJobs(RecurringJobQuery query) { limit = Integer.MAX_VALUE; sb.append(" LIMIT ").append(offset).append(",").append(limit); } - return SQLUtil.select(sql, table("recurring_jobs"), "`id`,`last_job_id`,`queue`,`payload`,`type`,`cron_expression`,`last_execution_at`,`created_at`", sb.toString().trim(), params.toArray()) - .stream() - .map(this::buildRecurringJobInfo) - .collect(Collectors.toList()); + try(PooledSQL sql = pool.get()) { + return SQLUtil.select(sql, table("recurring_jobs"), "`id`,`last_job_id`,`queue`,`payload`,`type`,`cron_expression`,`last_execution_at`,`created_at`", sb.toString().trim(), params.toArray()) + .stream() + .map(this::buildRecurringJobInfo) + .collect(Collectors.toList()); + } } public Map getJobCountsByStatuses() { Map counts = new HashMap<>(); - List> results = SQLUtil.select(sql, table("jobs"), "`status`,COUNT(`status`) AS `count`", "GROUP BY `status`"); - for(JobStatus status : JobStatus.values()) { - counts.put(status, results.stream().filter(r -> r.get("status") != null && r.get("status").equals(status.name())).map(r -> ((Long) r.get("count")).intValue()).findFirst().orElse(0)); + try(PooledSQL sql = pool.get()) { + List> results = SQLUtil.select(sql, table("jobs"), "`status`,COUNT(`status`) AS `count`", "GROUP BY `status`"); + for(JobStatus status : JobStatus.values()) { + counts.put(status, results.stream().filter(r -> r.get("status") != null && r.get("status").equals(status.name())).map(r -> ((Long) r.get("count")).intValue()).findFirst().orElse(0)); + } + return counts; } - return counts; } public void createEvent(JobEvent event) { event.checkRequired(); event.sanitize(); - SQLUtil.insert(sql, table("job_events"), new MapBuilder() - .set("id", event.getId()) - .set("ord", System.currentTimeMillis()) - .set("job_id", event.getJobId()) - .set("type", event.getType()) - .set("created_at", event.getCreatedAt()) - .build() - ); + try(PooledSQL sql = pool.get()) { + SQLUtil.insert(sql, table("job_events"), new MapBuilder() + .set("id", event.getId()) + .set("ord", System.currentTimeMillis()) + .set("job_id", event.getJobId()) + .set("type", event.getType()) + .set("created_at", event.getCreatedAt()) + .build() + ); + } } public JobEvent getEvent(UUID id) { - List> results = SQLUtil.select(sql, table("job_events"), "`id`,`job_id`,`type`,`created_at`", "WHERE `id`=? LIMIT 1", id); - if(results.size() == 0) - return null; - return buildJobEvent(results.get(0)); + try(PooledSQL sql = pool.get()) { + List> results = SQLUtil.select(sql, table("job_events"), "`id`,`job_id`,`type`,`created_at`", "WHERE `id`=? LIMIT 1", id); + if(results.size() == 0) + return null; + return buildJobEvent(results.get(0)); + } } public List queryEvents(UUID jobId) { - return SQLUtil.select(sql, table("job_events"), "`id`,`job_id`,`type`,`created_at`", "WHERE `job_id`=? ORDER BY `ord`", jobId).stream().map(this::buildJobEvent).collect(Collectors.toList()); + try(PooledSQL sql = pool.get()) { + return SQLUtil.select(sql, table("job_events"), "`id`,`job_id`,`type`,`created_at`", "WHERE `job_id`=? ORDER BY `ord`", jobId).stream().map(this::buildJobEvent).collect(Collectors.toList()); + } } public void createLogEntry(JobLogEntry entry) { entry.checkRequired(); entry.sanitize(); - SQLUtil.insert(sql, table("job_log_entries"), new MapBuilder() - .set("id", entry.getId()) - .set("ord", System.currentTimeMillis()) - .set("event_id", entry.getEventId()) - .set("level", entry.getLevel()) - .set("message", entry.getMessage()) - .set("created_at", entry.getCreatedAt()) - .build() - ); + try(PooledSQL sql = pool.get()) { + SQLUtil.insert(sql, table("job_log_entries"), new MapBuilder() + .set("id", entry.getId()) + .set("ord", System.currentTimeMillis()) + .set("event_id", entry.getEventId()) + .set("level", entry.getLevel()) + .set("message", entry.getMessage()) + .set("created_at", entry.getCreatedAt()) + .build() + ); + } } public JobLogEntry getLogEntry(UUID eventId, UUID id) { - List> results = SQLUtil.select(sql, table("job_log_entries"), "`id`,`event_id`,`level`,`message`,`created_at`", "WHERE `event_id`=? AND `id`=? LIMIT 1", eventId, id); - if(results.size() == 0) - return null; - return buildJobLogEntry(results.get(0)); + try(PooledSQL sql = pool.get()) { + List> results = SQLUtil.select(sql, table("job_log_entries"), "`id`,`event_id`,`level`,`message`,`created_at`", "WHERE `event_id`=? AND `id`=? LIMIT 1", eventId, id); + if(results.size() == 0) + return null; + return buildJobLogEntry(results.get(0)); + } } public List queryLogEntries(UUID eventId) { - return SQLUtil.select(sql, table("job_log_entries"), "`id`,`event_id`,`level`,`message`,`created_at`", "WHERE `event_id`=? ORDER BY `ord` ASC", eventId).stream().map(this::buildJobLogEntry).collect(Collectors.toList()); + try(PooledSQL sql = pool.get()) { + return SQLUtil.select(sql, table("job_log_entries"), "`id`,`event_id`,`level`,`message`,`created_at`", "WHERE `event_id`=? ORDER BY `ord` ASC", eventId).stream().map(this::buildJobLogEntry).collect(Collectors.toList()); + } } public void createWorker(JobWorkerInfo info) { info.checkRequired(); info.sanitize(); - SQLUtil.insert(sql, table("job_workers"), new MapBuilder() - .set("id", info.getId()) - .set("ord", System.currentTimeMillis()) - .set("queue", info.getQueue()) - .set("threads", info.getThreads()) - .set("online", info.isOnline()) - .set("hostname", info.getHostname()) - .set("last_heartbeat_at", info.getLastHeartbeatAt()) - .set("created_at", info.getCreatedAt()) - .build() - ); + try(PooledSQL sql = pool.get()) { + SQLUtil.insert(sql, table("job_workers"), new MapBuilder() + .set("id", info.getId()) + .set("ord", System.currentTimeMillis()) + .set("queue", info.getQueue()) + .set("threads", info.getThreads()) + .set("online", info.isOnline()) + .set("hostname", info.getHostname()) + .set("last_heartbeat_at", info.getLastHeartbeatAt()) + .set("created_at", info.getCreatedAt()) + .build() + ); + } } public JobWorkerInfo getWorker(UUID id) { - List> results = SQLUtil.select(sql, table("job_workers"), "`id`,`queue`,`hostname`,`threads`,`online`,`last_heartbeat_at`,`created_at`", "WHERE `id`=? LIMIT 1", id); - if(results.size() == 0) - return null; - return buildJobWorkerInfo(results.get(0)); + try(PooledSQL sql = pool.get()) { + List> results = SQLUtil.select(sql, table("job_workers"), "`id`,`queue`,`hostname`,`threads`,`online`,`last_heartbeat_at`,`created_at`", "WHERE `id`=? LIMIT 1", id); + if(results.size() == 0) + return null; + return buildJobWorkerInfo(results.get(0)); + } } public List queryWorkers() { - return SQLUtil.select(sql, table("job_workers"), "`id`,`queue`,`hostname`,`threads`,`online`,`last_heartbeat_at`,`created_at`", null).stream().map(this::buildJobWorkerInfo).collect(Collectors.toList()); + try(PooledSQL sql = pool.get()) { + return SQLUtil.select(sql, table("job_workers"), "`id`,`queue`,`hostname`,`threads`,`online`,`last_heartbeat_at`,`created_at`", null).stream().map(this::buildJobWorkerInfo).collect(Collectors.toList()); + } } public void markOfflineWorkers() { - SQLUtil.update(sql, table("job_workers"), new MapBuilder() - .set("online", false) - .build() - , "`online`=? AND `last_heartbeat_at`<=?", true, Date.from(Instant.now().minus(1, ChronoUnit.MINUTES))); + try(PooledSQL sql = pool.get()) { + SQLUtil.update(sql, table("job_workers"), new MapBuilder() + .set("online", false) + .build() + , "`online`=? AND `last_heartbeat_at`<=?", true, Date.from(Instant.now().minus(1, ChronoUnit.MINUTES))); + } } public void deleteOfflineWorkers() { - SQLUtil.delete(sql, table("job_workers"), "`online`=? AND `last_heartbeat_at`<=?", false, Date.from(Instant.now().minus(1, ChronoUnit.MINUTES))); + try(PooledSQL sql = pool.get()) { + SQLUtil.delete(sql, table("job_workers"), "`online`=? AND `last_heartbeat_at`<=?", false, Date.from(Instant.now().minus(1, ChronoUnit.MINUTES))); + } } public void setWorkerOnline(UUID id, boolean online) { - SQLUtil.update(sql, table("job_workers"), new MapBuilder() - .set("online", online) - .set("last_heartbeat_at", Date.from(Instant.now())) - .build() - ,"`id`=?", id); + try(PooledSQL sql = pool.get()) { + SQLUtil.update(sql, table("job_workers"), new MapBuilder() + .set("online", online) + .set("last_heartbeat_at", Date.from(Instant.now())) + .build() + ,"`id`=?", id); + } } public void updateRecurringJob(UUID id, UUID newJobId, Date lastExecutionAt) { - SQLUtil.update(sql, table("recurring_jobs"), new MapBuilder() - .set("last_job_id", newJobId) - .set("last_execution_at", lastExecutionAt) - .build() - , "`id`=?", id); + try(PooledSQL sql = pool.get()) { + SQLUtil.update(sql, table("recurring_jobs"), new MapBuilder() + .set("last_job_id", newJobId) + .set("last_execution_at", lastExecutionAt) + .build() + , "`id`=?", id); + } } private JobInfo buildJobInfo(Map values) { diff --git a/src/main/java/org/javawebstack/jobs/util/SQLUtil.java b/src/main/java/org/javawebstack/jobs/util/SQLUtil.java index 7c1c9ea..fcb111a 100644 --- a/src/main/java/org/javawebstack/jobs/util/SQLUtil.java +++ b/src/main/java/org/javawebstack/jobs/util/SQLUtil.java @@ -1,7 +1,7 @@ package org.javawebstack.jobs.util; import org.javawebstack.abstractdata.AbstractElement; -import org.javawebstack.orm.wrapper.SQL; +import org.javawebstack.orm.connection.SQL; import java.sql.ResultSet; import java.sql.SQLException; diff --git a/src/test/java/org/javawebstack/jobs/scheduler/sql/SQLJobSchedulerTest.java b/src/test/java/org/javawebstack/jobs/scheduler/sql/SQLJobSchedulerTest.java index b9d2962..8d6adca 100644 --- a/src/test/java/org/javawebstack/jobs/scheduler/sql/SQLJobSchedulerTest.java +++ b/src/test/java/org/javawebstack/jobs/scheduler/sql/SQLJobSchedulerTest.java @@ -2,28 +2,27 @@ import org.javawebstack.jobs.scheduler.JobScheduler; import org.javawebstack.jobs.scheduler.JobSchedulerTest; -import org.javawebstack.jobs.scheduler.sql.SQLJobScheduler; import org.javawebstack.jobs.test.TestProperties; import org.javawebstack.jobs.test.TestUtil; import org.javawebstack.jobs.test.precondition.SQLDatabaseAvailable; -import org.javawebstack.orm.wrapper.SQL; +import org.javawebstack.orm.connection.pool.SQLPool; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(SQLDatabaseAvailable.class) public class SQLJobSchedulerTest extends JobSchedulerTest { - private SQL sql; + private SQLPool pool; protected JobScheduler initScheduler() { - sql = TestProperties.createSQLDatabaseConnection(); - TestUtil.purgeSchedulerDatabase(sql); - return new SQLJobScheduler(sql, null); + pool = TestProperties.createSQLDatabaseConnection(); + TestUtil.purgeSchedulerDatabase(pool); + return new SQLJobScheduler(pool, null); } @AfterAll public void cleanup() { - TestUtil.purgeSchedulerDatabase(sql); + TestUtil.purgeSchedulerDatabase(pool); } } diff --git a/src/test/java/org/javawebstack/jobs/test/TestProperties.java b/src/test/java/org/javawebstack/jobs/test/TestProperties.java index 84066a1..9116378 100644 --- a/src/test/java/org/javawebstack/jobs/test/TestProperties.java +++ b/src/test/java/org/javawebstack/jobs/test/TestProperties.java @@ -1,12 +1,12 @@ package org.javawebstack.jobs.test; -import org.javawebstack.orm.wrapper.MySQL; -import org.javawebstack.orm.wrapper.SQL; +import org.javawebstack.orm.connection.MySQL; +import org.javawebstack.orm.connection.pool.MinMaxScaler; +import org.javawebstack.orm.connection.pool.SQLPool; import java.io.File; import java.io.FileInputStream; import java.io.IOException; -import java.sql.SQLException; import java.util.Properties; public class TestProperties { @@ -33,14 +33,14 @@ public static boolean isSQLDatabaseAvailable() { return properties.containsKey("database.mysql.host"); } - public static SQL createSQLDatabaseConnection() { - return new MySQL( + public static SQLPool createSQLDatabaseConnection() { + return new SQLPool(new MinMaxScaler(1,1), () -> new MySQL( properties.getProperty("database.mysql.host"), Integer.parseInt(properties.getProperty("database.mysql.port", "3306")), properties.getProperty("database.mysql.name", "jobs"), properties.getProperty("database.mysql.username", "jobs"), properties.getProperty("database.mysql.password", "") - ); + )); } } diff --git a/src/test/java/org/javawebstack/jobs/test/TestUtil.java b/src/test/java/org/javawebstack/jobs/test/TestUtil.java index 0f79a73..7c8d017 100644 --- a/src/test/java/org/javawebstack/jobs/test/TestUtil.java +++ b/src/test/java/org/javawebstack/jobs/test/TestUtil.java @@ -1,18 +1,19 @@ package org.javawebstack.jobs.test; -import org.javawebstack.orm.wrapper.SQL; +import org.javawebstack.orm.connection.pool.PooledSQL; +import org.javawebstack.orm.connection.pool.SQLPool; import java.sql.SQLException; public class TestUtil { - public static void purgeDatabase(SQL sql) { - purgeStorageDatabase(sql); - purgeSchedulerDatabase(sql); + public static void purgeDatabase(SQLPool pool) { + purgeStorageDatabase(pool); + purgeSchedulerDatabase(pool); } - public static void purgeStorageDatabase(SQL sql) { - try { + public static void purgeStorageDatabase(SQLPool pool) { + try(PooledSQL sql = pool.get()) { String[] TABLES = { "jobs", "job_events", @@ -27,8 +28,8 @@ public static void purgeStorageDatabase(SQL sql) { } } - public static void purgeSchedulerDatabase(SQL sql) { - try { + public static void purgeSchedulerDatabase(SQLPool pool) { + try(PooledSQL sql = pool.get()) { String[] TABLES = { "scheduled_jobs", "queued_jobs" From f29ff8870677aac7400a3f0300b17cd02d53d13a Mon Sep 17 00:00:00 2001 From: JanHolger Date: Wed, 20 Sep 2023 22:12:57 +0200 Subject: [PATCH 4/7] Fixed failed test --- .../jobs/storage/sql/SQLJobStorageTest.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/test/java/org/javawebstack/jobs/storage/sql/SQLJobStorageTest.java b/src/test/java/org/javawebstack/jobs/storage/sql/SQLJobStorageTest.java index 429ff48..051460c 100644 --- a/src/test/java/org/javawebstack/jobs/storage/sql/SQLJobStorageTest.java +++ b/src/test/java/org/javawebstack/jobs/storage/sql/SQLJobStorageTest.java @@ -2,29 +2,27 @@ import org.javawebstack.jobs.storage.JobStorage; import org.javawebstack.jobs.storage.JobStorageTest; -import org.javawebstack.jobs.storage.sql.SQLJobStorage; import org.javawebstack.jobs.test.TestProperties; import org.javawebstack.jobs.test.TestUtil; import org.javawebstack.jobs.test.precondition.SQLDatabaseAvailable; -import org.javawebstack.orm.wrapper.SQL; -import org.junit.jupiter.api.AfterAll; +import org.javawebstack.orm.connection.pool.SQLPool; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.extension.ExtendWith; @ExtendWith(SQLDatabaseAvailable.class) public class SQLJobStorageTest extends JobStorageTest { - private SQL sql; + private SQLPool pool; protected JobStorage initStorage() { - sql = TestProperties.createSQLDatabaseConnection(); - TestUtil.purgeStorageDatabase(sql); - return new SQLJobStorage(sql, null); + pool = TestProperties.createSQLDatabaseConnection(); + TestUtil.purgeStorageDatabase(pool); + return new SQLJobStorage(pool, null); } @AfterEach public void cleanup() { - TestUtil.purgeStorageDatabase(sql); + TestUtil.purgeStorageDatabase(pool); } } From eefea1ec62c91e6d453ee944e01eac7692e005ba Mon Sep 17 00:00:00 2001 From: JanHolger Date: Thu, 21 Dec 2023 14:16:00 +0100 Subject: [PATCH 5/7] Add new-line to trigger rebuild --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d15dc91..a13635e 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,4 @@ JWS Job Scheduling jobs 0.0.1-SNAPSHOT -``` \ No newline at end of file +``` From 4ed1d63bf7c8c4894d3d990db5cfe7d489e25f00 Mon Sep 17 00:00:00 2001 From: JanHolger Date: Thu, 21 Dec 2023 14:39:33 +0100 Subject: [PATCH 6/7] Changed the gpg key --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fa70a51..bd070a8 100644 --- a/pom.xml +++ b/pom.xml @@ -169,7 +169,7 @@ sign - A313520526A8DFE1C2A30399C35A3D43C557B112 + 6802C125C9069802B97A080910CE6063CEE9C47B gpg --no-tty From f473873e31efb375efe518e2ae8fceaee01a8bdb Mon Sep 17 00:00:00 2001 From: JanHolger Date: Tue, 21 Apr 2026 16:44:16 +0200 Subject: [PATCH 7/7] Switch to new central --- .github/workflows/maven-deploy-release.yml | 5 ++-- .github/workflows/maven-deploy.yml | 5 ++-- build/settings.xml | 16 ++-------- pom.xml | 34 +++++++++------------- 4 files changed, 20 insertions(+), 40 deletions(-) diff --git a/.github/workflows/maven-deploy-release.yml b/.github/workflows/maven-deploy-release.yml index dbf9bc0..b241f52 100644 --- a/.github/workflows/maven-deploy-release.yml +++ b/.github/workflows/maven-deploy-release.yml @@ -23,7 +23,6 @@ jobs: - name: Deploy to JavaWebStack Repository run: mvn deploy -B -DbuildVersion=${{ github.event.release.tag_name }} -s build/settings.xml -Dmaven.test.skip=true env: - DEPLOYMENT_USERNAME: ${{ secrets.DEPLOYMENT_USERNAME }} - DEPLOYMENT_PASSWORD: ${{ secrets.DEPLOYMENT_PASSWORD }} + CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }} + CENTRAL_PASSWORD: ${{ secrets.CENTRAL_PASSWORD }} GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} diff --git a/.github/workflows/maven-deploy.yml b/.github/workflows/maven-deploy.yml index b035e13..fd39229 100644 --- a/.github/workflows/maven-deploy.yml +++ b/.github/workflows/maven-deploy.yml @@ -24,7 +24,6 @@ jobs: - name: Deploy to JavaWebStack Repository run: mvn deploy -B -s build/settings.xml -Dmaven.test.skip=true env: - DEPLOYMENT_USERNAME: ${{ secrets.DEPLOYMENT_USERNAME }} - DEPLOYMENT_PASSWORD: ${{ secrets.DEPLOYMENT_PASSWORD }} + CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }} + CENTRAL_PASSWORD: ${{ secrets.CENTRAL_PASSWORD }} GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} diff --git a/build/settings.xml b/build/settings.xml index 07e7726..88571fa 100644 --- a/build/settings.xml +++ b/build/settings.xml @@ -5,19 +5,9 @@ > - javawebstack-snapshots - ${env.DEPLOYMENT_USERNAME} - ${env.DEPLOYMENT_PASSWORD} - - - javawebstack-releases - ${env.DEPLOYMENT_USERNAME} - ${env.DEPLOYMENT_PASSWORD} - - - ossrh - JavaWebStack - ${env.OSSRH_PASSWORD} + central + ${env.CENTRAL_USERNAME} + ${env.CENTRAL_PASSWORD} gpg diff --git a/pom.xml b/pom.xml index bd070a8..273848f 100644 --- a/pom.xml +++ b/pom.xml @@ -42,8 +42,8 @@ - ossrh - https://s01.oss.sonatype.org/content/repositories/snapshots + central-snapshots + https://central.sonatype.com/repository/maven-snapshots/ @@ -51,7 +51,7 @@ org.javawebstack abstract-data - 1.0.6 + 1.0.7-SNAPSHOT org.javawebstack @@ -114,17 +114,13 @@ - maven-deploy-plugin - 3.0.0-M1 - - - default-deploy - deploy - - deploy - - - + org.sonatype.central + central-publishing-maven-plugin + 0.9.0 + true + + central + org.apache.maven.plugins @@ -169,7 +165,7 @@ sign - 6802C125C9069802B97A080910CE6063CEE9C47B + EC9CCFF8901F0AA22191DCEDD619376246C066D0 gpg --no-tty @@ -185,13 +181,9 @@ - ossrh - https://s01.oss.sonatype.org/content/repositories/snapshots + central + https://central.sonatype.com/repository/maven-snapshots/ - - ossrh - https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ - \ No newline at end of file