From f2135fe81dd1289bf933738318d854d8b27e40df Mon Sep 17 00:00:00 2001 From: Paul Sterl Date: Wed, 1 Jan 2025 11:39:17 +0100 Subject: [PATCH 01/13] added mariadb --- RUN_AND_BUILD.md | 5 ++ core/pom.xml | 10 +++ .../model/TriggerHistoryDetailEntity.java | 14 ++-- .../model/TriggerHistoryLastStateEntity.java | 10 +-- .../scheduler/entity/SchedulerEntity.java | 2 +- .../trigger/model/TriggerEntity.java | 14 ++-- .../persistent_tasks/AbstractSpringTest.java | 2 +- .../TaskSchedulerServiceTest.java | 6 +- core/src/test/resources/application-maria.yml | 11 +++ .../db/changelog/db.changelog-master.xml | 4 +- .../db/pt-changelog-v1.xml | 68 +++++++++---------- 11 files changed, 84 insertions(+), 62 deletions(-) create mode 100644 core/src/test/resources/application-maria.yml diff --git a/RUN_AND_BUILD.md b/RUN_AND_BUILD.md index 23c0b6a0..d2a55e07 100644 --- a/RUN_AND_BUILD.md +++ b/RUN_AND_BUILD.md @@ -2,6 +2,11 @@ mvn versions:display-dependency-updates mvn versions:set -DnewVersion=1.2.1 -DgenerateBackupPoms=false mvn versions:set -DnewVersion=1.2.2-SNAPSHOT -DgenerateBackupPoms=false +## postgres docker run --name pg-container -e POSTGRES_USER=sa -e POSTGRES_PASSWORD=veryStrong123 -p 5432:5432 -d postgres +## azure-sql-edge docker run --cap-add SYS_PTRACE -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=veryStrong123' -p 1433:1433 --name azuresqledge -d mcr.microsoft.com/azure-sql-edge + +## MariaDB +docker run -e MYSQL_ROOT_PASSWORD=veryStrong123 -e MYSQL_DATABASE=testdb -e MYSQL_USER=sa -e MYSQL_PASSWORD=veryStrong123 -p 3306:3306 -d mariadb:latest diff --git a/core/pom.xml b/core/pom.xml index fc9fd218..ddb8b494 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -89,6 +89,16 @@ postgresql test + + com.mysql + mysql-connector-j + test + + + org.mariadb.jdbc + mariadb-java-client + test + diff --git a/core/src/main/java/org/sterl/spring/persistent_tasks/history/model/TriggerHistoryDetailEntity.java b/core/src/main/java/org/sterl/spring/persistent_tasks/history/model/TriggerHistoryDetailEntity.java index 5334dd23..9c46fc0c 100644 --- a/core/src/main/java/org/sterl/spring/persistent_tasks/history/model/TriggerHistoryDetailEntity.java +++ b/core/src/main/java/org/sterl/spring/persistent_tasks/history/model/TriggerHistoryDetailEntity.java @@ -25,12 +25,12 @@ * Just a copy of the trigger status but without any data/state. */ @Entity -@Table(name = "PT_TRIGGER_HISTORY_DETAILS", indexes = { - @Index(name = "IDX_PT_TRIGGERS_HISTORY_INSTANCE_ID", columnList = "instance_id"), - @Index(name = "IDX_PT_TRIGGERS_HISTORY_TASK_NAME", columnList = "task_name"), - @Index(name = "IDX_PT_TRIGGERS_HISTORY_TRIGGER_ID", columnList = "trigger_id"), - @Index(name = "IDX_PT_TRIGGERS_HISTORY_STATUS", columnList = "status"), - @Index(name = "IDX_PT_TRIGGERS_HISTORY_CREATED_TIME", columnList = "created_time"), +@Table(name = "pt_trigger_history_details", indexes = { + @Index(name = "idx_pt_triggers_history_instance_id", columnList = "instance_id"), + @Index(name = "idx_pt_triggers_history_task_name", columnList = "task_name"), + @Index(name = "idx_pt_triggers_history_trigger_id", columnList = "trigger_id"), + @Index(name = "idx_pt_triggers_history_status", columnList = "status"), + @Index(name = "idx_pt_triggers_history_created_time", columnList = "created_time"), }) @Data @NoArgsConstructor @@ -39,7 +39,7 @@ @EqualsAndHashCode(of = "id") public class TriggerHistoryDetailEntity implements HasTriggerData { - @GeneratedValue(generator = "SEQ_PT_TRIGGER_HISTORY_DETAILS", strategy = GenerationType.SEQUENCE) + @GeneratedValue(generator = "seq_pt_trigger_history_details", strategy = GenerationType.SEQUENCE) @Column(updatable = false) @Id private Long id; diff --git a/core/src/main/java/org/sterl/spring/persistent_tasks/history/model/TriggerHistoryLastStateEntity.java b/core/src/main/java/org/sterl/spring/persistent_tasks/history/model/TriggerHistoryLastStateEntity.java index e6b9504d..fbb09a36 100644 --- a/core/src/main/java/org/sterl/spring/persistent_tasks/history/model/TriggerHistoryLastStateEntity.java +++ b/core/src/main/java/org/sterl/spring/persistent_tasks/history/model/TriggerHistoryLastStateEntity.java @@ -20,11 +20,11 @@ import lombok.NoArgsConstructor; @Entity -@Table(name = "PT_TRIGGER_HISTORY_LAST_STATES", indexes = { - @Index(name = "IDX_PT_TRIGGER_HISTORY_LAST_STATES_TASK_NAME", columnList = "task_name"), - @Index(name = "IDX_PT_TRIGGER_HISTORY_LAST_STATES_TRIGGER_ID", columnList = "trigger_id"), - @Index(name = "IDX_PT_TRIGGER_HISTORY_LAST_STATES_STATUS", columnList = "status"), - @Index(name = "IDX_PT_TRIGGER_HISTORY_LAST_STATES_CREATED_TIME", columnList = "created_time"), +@Table(name = "pt_trigger_history_last_states", indexes = { + @Index(name = "idx_pt_trigger_history_last_states_task_name", columnList = "task_name"), + @Index(name = "idx_pt_trigger_history_last_states_trigger_id", columnList = "trigger_id"), + @Index(name = "idx_pt_trigger_history_last_states_status", columnList = "status"), + @Index(name = "idx_pt_trigger_history_last_states_created_time", columnList = "created_time"), }) @Data @NoArgsConstructor diff --git a/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/entity/SchedulerEntity.java b/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/entity/SchedulerEntity.java index ce9d802d..dd404378 100644 --- a/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/entity/SchedulerEntity.java +++ b/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/entity/SchedulerEntity.java @@ -13,7 +13,7 @@ import lombok.ToString; @Entity -@Table(name = "PT_SCHEDULER", indexes = @Index(name = "IDX_TASK_SCHEDULER_STATUS", columnList = "last_ping")) +@Table(name = "pt_scheduler", indexes = @Index(name = "idx_task_scheduler_status", columnList = "last_ping")) @Data @ToString(of = { "id", "lastPing", "runnungTasks", "tasksSlotCount" }) @EqualsAndHashCode(of = "id") diff --git a/core/src/main/java/org/sterl/spring/persistent_tasks/trigger/model/TriggerEntity.java b/core/src/main/java/org/sterl/spring/persistent_tasks/trigger/model/TriggerEntity.java index 89c16be0..87899e0b 100644 --- a/core/src/main/java/org/sterl/spring/persistent_tasks/trigger/model/TriggerEntity.java +++ b/core/src/main/java/org/sterl/spring/persistent_tasks/trigger/model/TriggerEntity.java @@ -25,12 +25,12 @@ import lombok.NoArgsConstructor; @Entity -@Table(name = "PT_TASK_TRIGGERS", indexes = { - @Index(name = "UNQ_PT_TRIGGERS_KEY", columnList = "trigger_id, task_name", unique = true), - @Index(name = "IDX_PT_TRIGGERS_PRIORITY", columnList = "priority"), - @Index(name = "IDX_PT_TRIGGERS_RUN_AT", columnList = "run_at"), - @Index(name = "IDX_PT_TRIGGERS_STATUS", columnList = "status"), - @Index(name = "IDX_PT_TRIGGERS_PING", columnList = "last_ping"), +@Table(name = "pt_task_triggers", indexes = { + @Index(name = "unq_pt_triggers_key", columnList = "trigger_id, task_name", unique = true), + @Index(name = "idx_pt_triggers_priority", columnList = "priority"), + @Index(name = "idx_pt_triggers_run_at", columnList = "run_at"), + @Index(name = "idx_pt_triggers_status", columnList = "status"), + @Index(name = "idx_pt_triggers_ping", columnList = "last_ping"), }) @Data @NoArgsConstructor @@ -39,7 +39,7 @@ @Builder public class TriggerEntity implements HasTriggerData { - @GeneratedValue(generator = "SEQ_PT_TASK_TRIGGERS", strategy = GenerationType.SEQUENCE) + @GeneratedValue(generator = "seq_pt_task_triggers", strategy = GenerationType.SEQUENCE) @Column(updatable = false) @Id private Long id; diff --git a/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java b/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java index ccf810d8..49fafb00 100644 --- a/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java +++ b/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java @@ -34,7 +34,7 @@ import uk.co.jemos.podam.api.PodamFactory; import uk.co.jemos.podam.api.PodamFactoryImpl; -//@ActiveProfiles("postgres") // postgres mssql +@ActiveProfiles("maria") // postgres mssql maria @SpringBootTest(classes = SampleApp.class, webEnvironment = WebEnvironment.RANDOM_PORT) public class AbstractSpringTest { diff --git a/core/src/test/java/org/sterl/spring/persistent_tasks/TaskSchedulerServiceTest.java b/core/src/test/java/org/sterl/spring/persistent_tasks/TaskSchedulerServiceTest.java index 3d678779..fb4fd233 100644 --- a/core/src/test/java/org/sterl/spring/persistent_tasks/TaskSchedulerServiceTest.java +++ b/core/src/test/java/org/sterl/spring/persistent_tasks/TaskSchedulerServiceTest.java @@ -59,11 +59,7 @@ void testLockTriggerInSchedulers() throws Exception { lockInvocations.add(() -> runNextTrigger()); } - while (triggerService.hasPendingTriggers()) { - schedulerService.triggerNextTasks(); - schedulerB.triggerNextTasks(); - Thread.sleep(10); - } + persistentTaskService.executeTriggersAndWait(); // THEN for (int i = 1; i <= 100; ++i) { diff --git a/core/src/test/resources/application-maria.yml b/core/src/test/resources/application-maria.yml new file mode 100644 index 00000000..a3d1adf9 --- /dev/null +++ b/core/src/test/resources/application-maria.yml @@ -0,0 +1,11 @@ +spring: + datasource: + username: root + password: veryStrong123 + url: jdbc:mariadb://localhost:3306/testdb + driver-class-name: org.mariadb.jdbc.Driver + hikari: + maximum-pool-size: 100 + jpa: + hibernate: + ddl-auto: none \ No newline at end of file diff --git a/core/src/test/resources/db/changelog/db.changelog-master.xml b/core/src/test/resources/db/changelog/db.changelog-master.xml index b43fc3dc..c72d6eee 100644 --- a/core/src/test/resources/db/changelog/db.changelog-master.xml +++ b/core/src/test/resources/db/changelog/db.changelog-master.xml @@ -8,10 +8,10 @@ http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd"> - + + primaryKeyName="pk_personbe_id" /> diff --git a/db/src/main/resources/spring-persistent-tasks/db/pt-changelog-v1.xml b/db/src/main/resources/spring-persistent-tasks/db/pt-changelog-v1.xml index f1ab91ea..6b72da0f 100644 --- a/db/src/main/resources/spring-persistent-tasks/db/pt-changelog-v1.xml +++ b/db/src/main/resources/spring-persistent-tasks/db/pt-changelog-v1.xml @@ -20,10 +20,10 @@ - + + primaryKeyName="PK_pt_task_triggers_ID" /> @@ -54,10 +54,10 @@ - + + primaryKeyName="pk_pt_trigger_history_details_id" /> @@ -85,10 +85,10 @@ - + + primaryKeyName="pk_pt_trigger_history_last_states_id" /> @@ -117,10 +117,10 @@ - + + primaryKeyName="pk_pt_scheduler_id" /> @@ -140,69 +140,69 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + minValue="-9223372036854775808" sequenceName="seq_pt_task_triggers" startValue="1" /> \ No newline at end of file From 153e7c07127a5d7292177b32a4394f502f4c628c Mon Sep 17 00:00:00 2001 From: Paul Sterl Date: Wed, 1 Jan 2025 11:48:03 +0100 Subject: [PATCH 02/13] Update build.yml --- .github/workflows/build.yml | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 01314585..17d290eb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -74,6 +74,29 @@ jobs: - name: Run tests with postgres run: mvn test -pl core -am -Dspring.profiles.active=postgres + test-mariadb: + runs-on: ubuntu-latest + needs: build + services: + postgres: + image: mariadb:latest + env: + MYSQL_USER: sa + MYSQL_ROOT_PASSWORD: veryStrong123 + MYSQL_PASSWORD: veryStrong123 + ports: + - 3306:3306 + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + cache: maven + - name: Run tests with mariadb + run: mvn test -pl core -am -Dspring.profiles.active=maria + java-doc: runs-on: ubuntu-latest needs: [build] @@ -105,7 +128,7 @@ jobs: maven-deploy: runs-on: ubuntu-latest - needs: [build, test-mssql, test-postgres] + needs: [build, test-mssql, test-postgres, test-mariadb] if: ${{ github.ref == 'refs/heads/main' }} steps: - uses: actions/checkout@v4 From e680ec8c00997b669165acbd45aaa32121c4e3ee Mon Sep 17 00:00:00 2001 From: Paul Sterl Date: Wed, 1 Jan 2025 11:52:35 +0100 Subject: [PATCH 03/13] added mysql --- RUN_AND_BUILD.md | 3 +++ .../spring/persistent_tasks/AbstractSpringTest.java | 2 +- core/src/test/resources/application-mysql.yml | 11 +++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 core/src/test/resources/application-mysql.yml diff --git a/RUN_AND_BUILD.md b/RUN_AND_BUILD.md index d2a55e07..0b28da4b 100644 --- a/RUN_AND_BUILD.md +++ b/RUN_AND_BUILD.md @@ -10,3 +10,6 @@ docker run --cap-add SYS_PTRACE -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=veryStr ## MariaDB docker run -e MYSQL_ROOT_PASSWORD=veryStrong123 -e MYSQL_DATABASE=testdb -e MYSQL_USER=sa -e MYSQL_PASSWORD=veryStrong123 -p 3306:3306 -d mariadb:latest + +## MySQL +docker run -e MYSQL_ROOT_PASSWORD=veryStrong123 -e MYSQL_DATABASE=testdb -e MYSQL_USER=sa -e MYSQL_PASSWORD=veryStrong123 -p 3306:3306 -d mysql:latest diff --git a/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java b/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java index 49fafb00..1855c431 100644 --- a/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java +++ b/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java @@ -34,7 +34,7 @@ import uk.co.jemos.podam.api.PodamFactory; import uk.co.jemos.podam.api.PodamFactoryImpl; -@ActiveProfiles("maria") // postgres mssql maria +//@ActiveProfiles("maria") // postgres mssql maria @SpringBootTest(classes = SampleApp.class, webEnvironment = WebEnvironment.RANDOM_PORT) public class AbstractSpringTest { diff --git a/core/src/test/resources/application-mysql.yml b/core/src/test/resources/application-mysql.yml new file mode 100644 index 00000000..d8ead579 --- /dev/null +++ b/core/src/test/resources/application-mysql.yml @@ -0,0 +1,11 @@ +spring: + datasource: + username: sa + password: veryStrong123 + url: jdbc:mysql://localhost:3306/testdb + driver-class-name: com.mysql.jdbc.Driver + hikari: + maximum-pool-size: 100 + jpa: + hibernate: + ddl-auto: none From 8d4a1cacce7d0657fb273de1ba41a35e29c4a5bb Mon Sep 17 00:00:00 2001 From: Paul Sterl Date: Wed, 1 Jan 2025 11:54:29 +0100 Subject: [PATCH 04/13] added mysql to pipeline --- .github/workflows/build.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 17d290eb..dbd608c1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -97,6 +97,29 @@ jobs: - name: Run tests with mariadb run: mvn test -pl core -am -Dspring.profiles.active=maria + test-mysql: + runs-on: ubuntu-latest + needs: build + services: + postgres: + image: mysql:latest + env: + MYSQL_USER: sa + MYSQL_ROOT_PASSWORD: veryStrong123 + MYSQL_PASSWORD: veryStrong123 + ports: + - 3306:3306 + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + cache: maven + - name: Run tests with mysql + run: mvn test -pl core -am -Dspring.profiles.active=mysql + java-doc: runs-on: ubuntu-latest needs: [build] From 8576b8388a37459764b74e3f44988db267823e16 Mon Sep 17 00:00:00 2001 From: Paul Sterl Date: Wed, 1 Jan 2025 12:02:35 +0100 Subject: [PATCH 05/13] rename maria to mariadb --- .github/workflows/build.yml | 3 ++- .../org/sterl/spring/persistent_tasks/AbstractSpringTest.java | 2 +- .../{application-maria.yml => application-mariadb.yml} | 0 3 files changed, 3 insertions(+), 2 deletions(-) rename core/src/test/resources/{application-maria.yml => application-mariadb.yml} (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 17d290eb..b2e11c01 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -84,6 +84,7 @@ jobs: MYSQL_USER: sa MYSQL_ROOT_PASSWORD: veryStrong123 MYSQL_PASSWORD: veryStrong123 + MYSQL_DATABASE: testdb ports: - 3306:3306 steps: @@ -95,7 +96,7 @@ jobs: distribution: 'temurin' cache: maven - name: Run tests with mariadb - run: mvn test -pl core -am -Dspring.profiles.active=maria + run: mvn test -pl core -am -Dspring.profiles.active=mariadb java-doc: runs-on: ubuntu-latest diff --git a/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java b/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java index 1855c431..e43b57f6 100644 --- a/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java +++ b/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java @@ -34,7 +34,7 @@ import uk.co.jemos.podam.api.PodamFactory; import uk.co.jemos.podam.api.PodamFactoryImpl; -//@ActiveProfiles("maria") // postgres mssql maria +//@ActiveProfiles("mariadb") // postgres mssql mariadb @SpringBootTest(classes = SampleApp.class, webEnvironment = WebEnvironment.RANDOM_PORT) public class AbstractSpringTest { diff --git a/core/src/test/resources/application-maria.yml b/core/src/test/resources/application-mariadb.yml similarity index 100% rename from core/src/test/resources/application-maria.yml rename to core/src/test/resources/application-mariadb.yml From 3ec3135d0c90e3cf12d491f2cd5787436641d12b Mon Sep 17 00:00:00 2001 From: Paul Sterl Date: Wed, 1 Jan 2025 12:05:56 +0100 Subject: [PATCH 06/13] build branch only with PR --- .github/workflows/build.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 52ad8f26..bc543b46 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,7 +2,7 @@ name: Java CI with Maven on: push: - branches: "*" + branches: "main" pull_request: branches: "*" @@ -84,7 +84,7 @@ jobs: MYSQL_USER: sa MYSQL_ROOT_PASSWORD: veryStrong123 MYSQL_PASSWORD: veryStrong123 - MYSQL_DATABASE: testdb + MYSQL_DATABASE: testdb ports: - 3306:3306 steps: @@ -108,6 +108,7 @@ jobs: MYSQL_USER: sa MYSQL_ROOT_PASSWORD: veryStrong123 MYSQL_PASSWORD: veryStrong123 + MYSQL_DATABASE: testdb ports: - 3306:3306 steps: @@ -152,7 +153,7 @@ jobs: maven-deploy: runs-on: ubuntu-latest - needs: [build, test-mssql, test-postgres, test-mariadb] + needs: [build, test-mssql, test-postgres, test-mariadb, test-mysql] if: ${{ github.ref == 'refs/heads/main' }} steps: - uses: actions/checkout@v4 From ad28f1ffb174408eea928836af4338183e916bb4 Mon Sep 17 00:00:00 2001 From: Paul Sterl Date: Wed, 1 Jan 2025 12:21:18 +0100 Subject: [PATCH 07/13] adjusted how we ping the registry to avoid concurrency problems --- .../scheduler/SchedulerService.java | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerService.java b/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerService.java index f1d00465..baa8b0be 100644 --- a/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerService.java +++ b/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerService.java @@ -100,21 +100,16 @@ public List> triggerNextTasks() { */ @NonNull public List> triggerNextTasks(OffsetDateTime timeDue) { - var triggers = trx.execute(t -> { - List result; - // in any case we say hello - final var runningOn = pingRegistry(); - if (taskExecutor.getFreeThreads() > 0) { - result = triggerService.lockNextTrigger( - name, taskExecutor.getFreeThreads(), timeDue); - runningOn.setRunnungTasks(taskExecutor.getRunningTasks() + result.size()); - } else { - result = Collections.emptyList(); - log.debug("triggerNextTasks({}) skipped as no free threads are available.", timeDue); - } - return result; - }); - return taskExecutor.submit(triggers); + List triggers; + if (taskExecutor.getFreeThreads() > 0) { + triggers = triggerService.lockNextTrigger( + name, taskExecutor.getFreeThreads(), timeDue); + } else { + triggers = Collections.emptyList(); + } + var result = taskExecutor.submit(triggers); + pingRegistry(); + return result; } /** From 276e8dacf6fbf695b16ba74354e27d161af90417 Mon Sep 17 00:00:00 2001 From: Paul Sterl Date: Wed, 1 Jan 2025 12:31:10 +0100 Subject: [PATCH 08/13] added missing transaction wrapper --- .../spring/persistent_tasks/scheduler/SchedulerService.java | 2 +- .../persistent_tasks/scheduler/SchedulerServiceTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerService.java b/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerService.java index baa8b0be..fd5750a8 100644 --- a/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerService.java +++ b/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerService.java @@ -108,7 +108,7 @@ public List> triggerNextTasks(OffsetDateTime timeDue) { triggers = Collections.emptyList(); } var result = taskExecutor.submit(triggers); - pingRegistry(); + trx.executeWithoutResult(t -> this.pingRegistry()); return result; } diff --git a/core/src/test/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerServiceTest.java b/core/src/test/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerServiceTest.java index 77570383..2f6d9181 100644 --- a/core/src/test/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerServiceTest.java +++ b/core/src/test/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerServiceTest.java @@ -44,7 +44,7 @@ void testWillTriggerOnlyFreeThreadSize() throws Exception { for (int i = 0; i < 15; i++) { triggerService.queue(TaskTriggerBuilder .newTrigger("slowTask") - .state(50L) + .state(200L) .build() ); } @@ -53,9 +53,9 @@ void testWillTriggerOnlyFreeThreadSize() throws Exception { subject.triggerNextTasks(); // THEN - Thread.sleep(15); assertThat(triggerService.countTriggers(TriggerStatus.RUNNING)).isEqualTo(10); assertThat(triggerService.countTriggers(TriggerStatus.WAITING)).isEqualTo(5); + // AND final SchedulerEntity scheduler = subject.getScheduler(); assertThat(scheduler.getRunnungTasks()).isEqualTo(10); From 8fd780402da4b49e04976376f42968c30d81a401 Mon Sep 17 00:00:00 2001 From: Paul Sterl Date: Wed, 1 Jan 2025 12:34:28 +0100 Subject: [PATCH 09/13] ping will always start a transaction --- .../scheduler/SchedulerService.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerService.java b/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerService.java index fd5750a8..d3582742 100644 --- a/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerService.java +++ b/core/src/main/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerService.java @@ -70,11 +70,14 @@ public void shutdownNow() { } public SchedulerEntity pingRegistry() { - var result = editSchedulerStatus.checkinToRegistry(name); - result.setRunnungTasks(taskExecutor.getRunningTasks()); - result.setTasksSlotCount(taskExecutor.getMaxThreads()); - log.debug("Ping {}", result); - return result; + // using trx template to ensure the TRX is started if we use this method internally + return trx.execute(t -> { + var result = editSchedulerStatus.checkinToRegistry(name); + result.setRunnungTasks(taskExecutor.getRunningTasks()); + result.setTasksSlotCount(taskExecutor.getMaxThreads()); + log.debug("Ping {}", result); + return result; + }); } public SchedulerEntity getScheduler() { @@ -108,7 +111,7 @@ public List> triggerNextTasks(OffsetDateTime timeDue) { triggers = Collections.emptyList(); } var result = taskExecutor.submit(triggers); - trx.executeWithoutResult(t -> this.pingRegistry()); + pingRegistry(); return result; } From 00b519bacc05119c745de8a4a30c3749346e5864 Mon Sep 17 00:00:00 2001 From: Paul Sterl Date: Wed, 1 Jan 2025 12:58:03 +0100 Subject: [PATCH 10/13] removed mysql --- .github/workflows/build.yml | 26 +------------------ README.md | 15 ++++++----- RUN_AND_BUILD.md | 2 +- .../persistent_tasks/AbstractSpringTest.java | 2 +- core/src/test/resources/application-mysql.yml | 2 +- 5 files changed, 13 insertions(+), 34 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bc543b46..8c7c3d0b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -98,30 +98,6 @@ jobs: - name: Run tests with mariadb run: mvn test -pl core -am -Dspring.profiles.active=mariadb - test-mysql: - runs-on: ubuntu-latest - needs: build - services: - postgres: - image: mysql:latest - env: - MYSQL_USER: sa - MYSQL_ROOT_PASSWORD: veryStrong123 - MYSQL_PASSWORD: veryStrong123 - MYSQL_DATABASE: testdb - ports: - - 3306:3306 - steps: - - uses: actions/checkout@v4 - - name: Set up JDK 21 - uses: actions/setup-java@v4 - with: - java-version: '21' - distribution: 'temurin' - cache: maven - - name: Run tests with mysql - run: mvn test -pl core -am -Dspring.profiles.active=mysql - java-doc: runs-on: ubuntu-latest needs: [build] @@ -153,7 +129,7 @@ jobs: maven-deploy: runs-on: ubuntu-latest - needs: [build, test-mssql, test-postgres, test-mariadb, test-mysql] + needs: [build, test-mssql, test-postgres, test-mariadb] if: ${{ github.ref == 'refs/heads/main' }} steps: - uses: actions/checkout@v4 diff --git a/README.md b/README.md index ec8a4c1e..45ba8cb7 100644 --- a/README.md +++ b/README.md @@ -12,15 +12,18 @@ Secondary goal is to support [Poor mans Workflow](https://github.com/sterlp/pmw) ## Tested in the pipeline -- H2 -- azure-sql-edge (MSSQL) +- H2 +- azure-sql-edge (MSSQL) +- PostgreSQL +- MariaDB ## Supported in theory -- MSSQL -- PostgreSQL -- mySQL -- MariaDB +- MSSQL, as azure-sql-edge is tested + +## Not supported + +- mySQL: sequences are not supported # Setup and Run a Task diff --git a/RUN_AND_BUILD.md b/RUN_AND_BUILD.md index 0b28da4b..c53a662f 100644 --- a/RUN_AND_BUILD.md +++ b/RUN_AND_BUILD.md @@ -12,4 +12,4 @@ docker run --cap-add SYS_PTRACE -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=veryStr docker run -e MYSQL_ROOT_PASSWORD=veryStrong123 -e MYSQL_DATABASE=testdb -e MYSQL_USER=sa -e MYSQL_PASSWORD=veryStrong123 -p 3306:3306 -d mariadb:latest ## MySQL -docker run -e MYSQL_ROOT_PASSWORD=veryStrong123 -e MYSQL_DATABASE=testdb -e MYSQL_USER=sa -e MYSQL_PASSWORD=veryStrong123 -p 3306:3306 -d mysql:latest +docker run -e MYSQL_ROOT_PASSWORD=veryStrong123 -e MYSQL_DATABASE=testdb -e MYSQL_USER=sa -e MYSQL_PASSWORD=veryStrong123 -p 3306:3306 -d mysql diff --git a/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java b/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java index e43b57f6..db53e9db 100644 --- a/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java +++ b/core/src/test/java/org/sterl/spring/persistent_tasks/AbstractSpringTest.java @@ -34,7 +34,7 @@ import uk.co.jemos.podam.api.PodamFactory; import uk.co.jemos.podam.api.PodamFactoryImpl; -//@ActiveProfiles("mariadb") // postgres mssql mariadb +// @ActiveProfiles("mssql") // postgres mssql mariadb mysql @SpringBootTest(classes = SampleApp.class, webEnvironment = WebEnvironment.RANDOM_PORT) public class AbstractSpringTest { diff --git a/core/src/test/resources/application-mysql.yml b/core/src/test/resources/application-mysql.yml index d8ead579..2f5af7b4 100644 --- a/core/src/test/resources/application-mysql.yml +++ b/core/src/test/resources/application-mysql.yml @@ -1,6 +1,6 @@ spring: datasource: - username: sa + username: root password: veryStrong123 url: jdbc:mysql://localhost:3306/testdb driver-class-name: com.mysql.jdbc.Driver From 363d9478dc6c5460241c1c860b6004110ed1c8dc Mon Sep 17 00:00:00 2001 From: Paul Sterl Date: Wed, 1 Jan 2025 13:18:55 +0100 Subject: [PATCH 11/13] update to readme --- CHANGELOG.md | 5 +++++ README.md | 2 ++ core/src/test/resources/application-mysql.yml | 5 ++++- screenshots/supported-dbs.png | Bin 0 -> 44065 bytes 4 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 screenshots/supported-dbs.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fb57d07..bf1398d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## v1.3.0 - (2025-01-01) + +- MariaDB support +- PostgreSQL support + ## v1.2.0 - (2024-12-31) - Run now button in the UI diff --git a/README.md b/README.md index 45ba8cb7..33fda7ec 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,8 @@ Secondary goal is to support [Poor mans Workflow](https://github.com/sterlp/pmw) - PostgreSQL - MariaDB +![History](screenshots/supported-dbs.png) + ## Supported in theory - MSSQL, as azure-sql-edge is tested diff --git a/core/src/test/resources/application-mysql.yml b/core/src/test/resources/application-mysql.yml index 2f5af7b4..6416497f 100644 --- a/core/src/test/resources/application-mysql.yml +++ b/core/src/test/resources/application-mysql.yml @@ -7,5 +7,8 @@ spring: hikari: maximum-pool-size: 100 jpa: + properties: + hibernate: + dialect: org.hibernate.dialect.MySQLDialect hibernate: - ddl-auto: none + ddl-auto: create diff --git a/screenshots/supported-dbs.png b/screenshots/supported-dbs.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2b72c011a935e225ad9c08cbb9f3aace59a602 GIT binary patch literal 44065 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�b|^8DNS-gKCg?OC8 zzqrdkEWiJPQx5?;{~~z*|A*j}bOtd#!)ilPVVnr^HFp$4V8W}vQO|GA3A(Bpx3=*` z)$bTp_AnMTh?s0BoKt;Patm`L&uGOJVL;Hv2eXaYKSe6*|1!#c>2qa~SM_ncXM(q^ zA@v{Q5KMbfKTM$@NhnjXb#jQjZhL?*M*3FpA^hqu0!^Q#3#tXAcV!Wk4Kn>#s=+u8#P50X z4PdRCkK@aC%Fi6(&gqFyyVh54YRJd2G?fTEFJnDsl60gH3!Iyto1in~H-}10s`sFl z0)UgVo9OR;7$gR0^g@jBfu~!hcI4gn-f;{&Kp9F#EfIYeyoskJSg}SV1I~!v-zlnvCJf)N*&%?2jhf5lveM-k;dvd z*=R{;A{GiWaDFdxTTCsWxMuR!yIu82Yws@85C7=h@ArwR94XIsP!$OXR)s4_x;gIe zI3K~H?{rR!1%Jcg-IxbORX4% z?B{fjN|vM-B{)SEyfh9o+FHUk@7N}fdEZK?r~d9`KS8jOr1(_*f@;?JFpHzWyJQW) z5Z}9pbjuo_mJ4BH{tlCyX;+V|<{Z;8gLB9Xf*ooO`%9tHl5Uq=AO2SQn>^nFKbDD1 zzcT|L^Dyp0c&&vOLw5mA8oAup`|ODz~bqAe(}=ML?={DnTUPijs{$%Kgp&tpd~y^st7!~&^N zS5e`^M=zxS2I=Z@gZlNO`E&Xz4bZnqpMsYkK9b}IV8ssU(9Ybye-jUi`6sEt>c37i zr;WKlAxr&;nj@v(t0(ZKzJP1}UC2vm@NHhDM!%yEX@gShhwViLe%JR)Bmi-WUTE_? z5_>ha1jSg5?bZCAsxKsOf{*9?^&H%L_RIei)Ca$*r^pchU5unA;EHs#<+oQKiTq}P zayu?|ev$gU8J#v(1FtC#-x57i<2A;2L|*TknlpbFvE;8UYr(s|9#Q4w2fC%wa{pjA@64@FsixBSZk{74YZ zc`_b8`kxWT<3#WW!~Z7x{CzBX@js^Yr5iAfM1@hFM{1s+-GboT_1(&%M<05r4Jy|V z+MNE6HdO%Q4~B{_^}_Fhd^&(S yZNkp*OXj1^l${AYXuKRV_;*3FT0Xc_{na!<*8{#?2C_AO$=z4JS8(@{@Bab8UP#se literal 0 HcmV?d00001 From bd0b40903c131919e7b26be55e27ec366cba0975 Mon Sep 17 00:00:00 2001 From: Paul Sterl Date: Wed, 1 Jan 2025 13:25:58 +0100 Subject: [PATCH 12/13] v1.3.0 release --- RUN_AND_BUILD.md | 4 ++-- core/pom.xml | 2 +- db/pom.xml | 2 +- example/pom.xml | 2 +- pom.xml | 2 +- ui/pom.xml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/RUN_AND_BUILD.md b/RUN_AND_BUILD.md index c53a662f..209cdd5c 100644 --- a/RUN_AND_BUILD.md +++ b/RUN_AND_BUILD.md @@ -1,6 +1,6 @@ mvn versions:display-dependency-updates -mvn versions:set -DnewVersion=1.2.1 -DgenerateBackupPoms=false -mvn versions:set -DnewVersion=1.2.2-SNAPSHOT -DgenerateBackupPoms=false +mvn versions:set -DnewVersion=1.3.0 -DgenerateBackupPoms=false +mvn versions:set -DnewVersion=1.3.1-SNAPSHOT -DgenerateBackupPoms=false ## postgres docker run --name pg-container -e POSTGRES_USER=sa -e POSTGRES_PASSWORD=veryStrong123 -p 5432:5432 -d postgres diff --git a/core/pom.xml b/core/pom.xml index ddb8b494..b9a50011 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -6,7 +6,7 @@ org.sterl.spring spring-persistent-tasks-root - 1.2.2-SNAPSHOT + 1.3.0 ../pom.xml diff --git a/db/pom.xml b/db/pom.xml index 8082322c..6460aa03 100644 --- a/db/pom.xml +++ b/db/pom.xml @@ -6,7 +6,7 @@ org.sterl.spring spring-persistent-tasks-root - 1.2.2-SNAPSHOT + 1.3.0 ../pom.xml diff --git a/example/pom.xml b/example/pom.xml index 482ecb53..34b7341c 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -6,7 +6,7 @@ org.sterl.spring spring-persistent-tasks-root - 1.2.2-SNAPSHOT + 1.3.0 ../pom.xml diff --git a/pom.xml b/pom.xml index aa245564..5513db78 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ org.sterl.spring spring-persistent-tasks-root - 1.2.2-SNAPSHOT + 1.3.0 pom 2024 diff --git a/ui/pom.xml b/ui/pom.xml index 5b533a38..01c14a25 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -6,7 +6,7 @@ org.sterl.spring spring-persistent-tasks-root - 1.2.2-SNAPSHOT + 1.3.0 ../pom.xml From 3c02067bd5041fb356064295d696b557049bc976 Mon Sep 17 00:00:00 2001 From: Paul Sterl Date: Wed, 1 Jan 2025 13:27:28 +0100 Subject: [PATCH 13/13] v1.3.1-SNAPSHOT --- core/pom.xml | 2 +- db/pom.xml | 2 +- example/pom.xml | 2 +- pom.xml | 2 +- ui/pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index b9a50011..9eae2c4d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -6,7 +6,7 @@ org.sterl.spring spring-persistent-tasks-root - 1.3.0 + 1.3.1-SNAPSHOT ../pom.xml diff --git a/db/pom.xml b/db/pom.xml index 6460aa03..2eca93ac 100644 --- a/db/pom.xml +++ b/db/pom.xml @@ -6,7 +6,7 @@ org.sterl.spring spring-persistent-tasks-root - 1.3.0 + 1.3.1-SNAPSHOT ../pom.xml diff --git a/example/pom.xml b/example/pom.xml index 34b7341c..fd8453e7 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -6,7 +6,7 @@ org.sterl.spring spring-persistent-tasks-root - 1.3.0 + 1.3.1-SNAPSHOT ../pom.xml diff --git a/pom.xml b/pom.xml index 5513db78..4e3455ce 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ org.sterl.spring spring-persistent-tasks-root - 1.3.0 + 1.3.1-SNAPSHOT pom 2024 diff --git a/ui/pom.xml b/ui/pom.xml index 01c14a25..415d6f25 100644 --- a/ui/pom.xml +++ b/ui/pom.xml @@ -6,7 +6,7 @@ org.sterl.spring spring-persistent-tasks-root - 1.3.0 + 1.3.1-SNAPSHOT ../pom.xml